Ignore calls with <= width or height.
authorOwen Taylor <otaylor@redhat.com>
Mon, 3 Jul 2000 19:00:23 +0000 (19:00 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Mon, 3 Jul 2000 19:00:23 +0000 (19:00 +0000)
Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>

* gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
<= width or height.

* gtk/gtktable.c (gtk_table_attach): Fix missed merge
from 1.2 for parent/child states.

* gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
of typos.

* gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
event structures, replace with a generic axes field. Replace
deviceid/source with GdkDevice *device.

* gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
to extract particular axis use value from event. (Also
can be used for normal X/Y.)

* gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
allow for arbitrary number of axes, namespace everything
as gdk_device_*. Replace guint32 deviceid with GdkDevice *
everywhere.

* gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}:
Get rid of the gdk_input_vtable setup if favor of simply
defining the functions in gdkinput-none/gxi/xfree.c in
a similar fashion to the way that the port structure is
done.

* gtk/gtkdnd.c: Fix fields of synthesized button press event
for new event structures.

* gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
new device interfaces.

26 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/gdkevents.c
gdk/gdkevents.h
gdk/gdkgc.c
gdk/gdkinput.h
gdk/x11/gdkevents-x11.c
gdk/x11/gdkinput-gxi.c
gdk/x11/gdkinput-none.c
gdk/x11/gdkinput-x11.c
gdk/x11/gdkinput-xfree.c
gdk/x11/gdkinput.c
gdk/x11/gdkinputprivate.h
gdk/x11/gdkmain-x11.c
gtk/gtkdnd.c
gtk/gtkinputdialog.c
gtk/gtkinputdialog.h
gtk/gtktable.c
gtk/gtkwidget.c
gtk/testinput.c
tests/testinput.c

index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index f7a675fa3dadbddbefb77db0cec824eb24fe5dc7..31fc47a1dd5ffe2a35845e8bae2f80ae721338f2 100644 (file)
@@ -1,3 +1,39 @@
+Mon Jul  3 14:24:16 2000  Owen Taylor  <otaylor@redhat.com>
+
+       * gtk/gtkwidget.c (gtk_widget_draw): Ignore calls with
+       <= width or height.
+
+       * gtk/gtktable.c (gtk_table_attach): Fix missed merge
+       from 1.2 for parent/child states.
+
+       * gdk/gdkgc.c (gdk_gc_set_rgb_fg/bg_color): Fix a couple
+       of typos.
+
+       * gdk/gdkevents.[ch]: Remove press/xtilt/ytilt fields of
+       event structures, replace with a generic axes field. Replace 
+       deviceid/sourec with GdkDevice *device.
+
+       * gdk/gdkevents.[ch] (gdk_event_get_axis): Add function
+       to extract particular axis use value from event. (Also
+       can be used for normal X/Y.)
+
+       * gdk/gdkinput.h gdk/x11/gdkinput*: Major revision;
+       allow for arbitrary number of axes, namespace everything
+       as gdk_device_*. Replace guint32 deviceid with GdkDevice *
+       everywhere.
+
+       * gdk/x11/{gdkmain-x11.c,gdkevent-x11.c,gdkinput*}: 
+       Get rid of the gdk_input_vtable setup if favor of simply
+       defining the functions in gdkinput-none/gxi/xfree.c in
+       a similar fashion to the way that the port structure is 
+       done.
+
+       * gtk/gtkdnd.c: Fix fields of synthesized button press event
+       for new event structures. 
+
+       * gtk/gtkinputdialog.c gtk/testinput.c: Revise to match
+       new device interfaces.
+
 Sun Jul  2 18:19:50 2000  Owen Taylor  <otaylor@redhat.com>
 
        * gtk/gtkwidget.[ch] (gtk_widget_create_pango_layout): Add a 'text' argument to
index 86658bc449a005d592ba0305f70ad9845f0b5d76..9fd127c24aeb5f37cada03c02ea6570378b83296 100644 (file)
@@ -377,6 +377,17 @@ gdk_event_free (GdkEvent *event)
     case GDK_DROP_FINISHED:
       gdk_drag_context_unref (event->dnd.context);
       break;
+
+    case GDK_BUTTON_PRESS:
+    case GDK_BUTTON_RELEASE:
+      if (event->button.axes)
+       g_free (event->button.axes);
+      break;
+
+    case GDK_MOTION_NOTIFY:
+      if (event->motion.axes)
+       g_free (event->motion.axes);
+      break;
       
     default:
       break;
@@ -440,6 +451,80 @@ gdk_event_get_time (GdkEvent *event)
   return GDK_CURRENT_TIME;
 }
 
+/**
+ * gdk_event_get_axis:
+ * @event: a #GdkEvent
+ * @axis_use: the axis use to look for
+ * @value: location to store the value found
+ * 
+ * Extract the axis value for a particular axis use from
+ * an event structure.
+ * 
+ * Return value: %TRUE if the specified axis was found, otherwise %FALSE
+ **/
+gboolean
+gdk_event_get_axis (GdkEvent   *event,
+                   GdkAxisUse  axis_use,
+                   gdouble    *value)
+{
+  gdouble *axes;
+  GdkDevice *device;
+  
+  g_return_val_if_fail (event != NULL, FALSE);
+  
+  if (axis_use == GDK_AXIS_X || axis_use == GDK_AXIS_Y)
+    {
+      gdouble x, y;
+      
+      switch (event->type)
+       {
+       case GDK_MOTION_NOTIFY:
+         x = event->motion.x;
+         y = event->motion.y;
+         break;
+       case GDK_SCROLL:
+         x = event->scroll.x;
+         y = event->scroll.y;
+         break;
+       case GDK_BUTTON_PRESS:
+       case GDK_BUTTON_RELEASE:
+         x = event->button.x;
+         y = event->button.y;
+         break;
+       case GDK_ENTER_NOTIFY:
+       case GDK_LEAVE_NOTIFY:
+         x = event->crossing.x;
+         y = event->crossing.y;
+         break;
+         
+       default:
+         return FALSE;
+       }
+
+      if (axis_use == GDK_AXIS_X && value)
+       *value = x;
+      if (axis_use == GDK_AXIS_Y && value)
+       *value = y;
+
+      return TRUE;
+    }
+  else if (event->type == GDK_BUTTON_PRESS ||
+          event->type == GDK_BUTTON_RELEASE)
+    {
+      device = event->button.device;
+      axes = event->button.axes;
+    }
+  else if (event->type == GDK_MOTION_NOTIFY)
+    {
+      device = event->motion.device;
+      axes = event->motion.axes;
+    }
+  else
+    return FALSE;
+
+  return gdk_device_get_axis (device, axes, axis_use, value);
+}
+
 /*
  *--------------------------------------------------------------
  * gdk_set_show_events
index 9997fbee2c9d05095a4b10aae682ca21d0205ccd..a6d8384f6b2146c4e48e9b56ec232ec2612960a4 100644 (file)
@@ -231,13 +231,10 @@ struct _GdkEventMotion
   guint32 time;
   gdouble x;
   gdouble y;
-  gdouble pressure;
-  gdouble xtilt;
-  gdouble ytilt;
+  gdouble *axes;
   guint state;
   gint16 is_hint;
-  GdkInputSource source;
-  guint32 deviceid;
+  GdkDevice *device;
   gdouble x_root, y_root;
 };
 
@@ -249,13 +246,10 @@ struct _GdkEventButton
   guint32 time;
   gdouble x;
   gdouble y;
-  gdouble pressure;
-  gdouble xtilt;
-  gdouble ytilt;
+  gdouble *axes;
   guint state;
   guint button;
-  GdkInputSource source;
-  guint32 deviceid;
+  GdkDevice *device;
   gdouble x_root, y_root;
 };
 
@@ -267,13 +261,9 @@ struct _GdkEventScroll
   guint32 time;
   gdouble x;
   gdouble y;
-  gdouble pressure;
-  gdouble xtilt;
-  gdouble ytilt;
   guint state;
   GdkScrollDirection direction;
-  GdkInputSource source;
-  guint32 deviceid;
+  GdkDevice *device;
   gdouble x_root, y_root;
 };
 
@@ -355,8 +345,7 @@ struct _GdkEventProximity
   GdkWindow *window;
   gint8 send_event;
   guint32 time;
-  GdkInputSource source;
-  guint32 deviceid;
+  GdkDevice *device;
 };
 
 struct _GdkEventClient
@@ -416,6 +405,9 @@ void      gdk_event_put                     (GdkEvent       *event);
 GdkEvent* gdk_event_copy               (GdkEvent       *event);
 void     gdk_event_free                (GdkEvent       *event);
 guint32   gdk_event_get_time           (GdkEvent       *event);
+gboolean  gdk_event_get_axis            (GdkEvent       *event,
+                                        GdkAxisUse      axis_use,
+                                        gdouble        *value);
 
 void     gdk_event_handler_set         (GdkEventFunc    func,
                                         gpointer        data,
index 8a54612e28c2c17013e31604a0f54388a4d56126..07f80e94ab49d46f3af40d8c3013037a6ef7ac11 100644 (file)
@@ -443,7 +443,7 @@ gdk_gc_set_rgb_fg_color (GdkGC *gc, GdkColor *color)
 
   tmp_color = *color;
   gdk_rgb_find_color (cmap, &tmp_color);
-  gdk_gc_set_foreground (cmap, &tmp_color);
+  gdk_gc_set_foreground (gc, &tmp_color);
 }
 
 /**
@@ -474,5 +474,5 @@ gdk_gc_set_rgb_bg_color (GdkGC *gc, GdkColor *color)
 
   tmp_color = *color;
   gdk_rgb_find_color (cmap, &tmp_color);
-  gdk_gc_set_foreground (cmap, &tmp_color);
+  gdk_gc_set_foreground (gc, &tmp_color);
 }
index 35550b2655f0288ea208b4480fed8dbae8b6fab3..35c915f72cf89436261fa30c8b259d0d1825415e 100644 (file)
@@ -8,7 +8,8 @@ extern "C" {
 #endif /* __cplusplus */
 
 typedef struct _GdkDeviceKey       GdkDeviceKey;
-typedef struct _GdkDeviceInfo      GdkDeviceInfo;
+typedef struct _GdkDeviceAxis      GdkDeviceAxis;
+typedef struct _GdkDevice          GdkDevice;
 typedef struct _GdkTimeCoord       GdkTimeCoord;
 
 typedef enum
@@ -41,66 +42,91 @@ typedef enum
   GDK_AXIS_PRESSURE,
   GDK_AXIS_XTILT,
   GDK_AXIS_YTILT,
+  GDK_AXIS_WHEEL,
   GDK_AXIS_LAST
 } GdkAxisUse;
 
-struct _GdkDeviceInfo
+struct _GdkDeviceKey
+{
+  guint keyval;
+  GdkModifierType modifiers;
+};
+
+struct _GdkDeviceAxis
+{
+  GdkAxisUse use;
+  gdouble    min;
+  gdouble    max;
+};
+
+struct _GdkDevice
 {
-  guint32 deviceid;
+  /* All fields are read-only */
+         
   gchar *name;
   GdkInputSource source;
   GdkInputMode mode;
-  gint has_cursor;     /* TRUE if the X pointer follows device motion */
+  gboolean has_cursor;      /* TRUE if the X pointer follows device motion */
+         
   gint num_axes;
-  GdkAxisUse *axes;    /* Specifies use for each axis */
+  GdkDeviceAxis *axes;
+         
   gint num_keys;
   GdkDeviceKey *keys;
 };
 
-struct _GdkDeviceKey
-{
-  guint keyval;
-  GdkModifierType modifiers;
-};
+/* We don't allocate each coordinate this big, but we use it to
+ * be ANSI compliant and avoid accessing past the defined limits.
+ */
+#define GDK_MAX_TIMECOORD_AXES 128
 
 struct _GdkTimeCoord
 {
   guint32 time;
-  gdouble x;
-  gdouble y;
-  gdouble pressure;
-  gdouble xtilt;
-  gdouble ytilt;
+  gdouble axes[GDK_MAX_TIMECOORD_AXES];
 };
 
-GList *       gdk_input_list_devices         (void);
-void          gdk_input_set_extension_events (GdkWindow        *window,
-                                             gint              mask,
-                                             GdkExtensionMode  mode);
-void          gdk_input_set_source           (guint32           deviceid,
-                                             GdkInputSource    source);
-gboolean      gdk_input_set_mode             (guint32           deviceid,
-                                             GdkInputMode      mode);
-void          gdk_input_set_axes             (guint32           deviceid,
-                                             GdkAxisUse       *axes);
-void          gdk_input_set_key              (guint32           deviceid,
-                                             guint             index,
-                                             guint             keyval,
-                                             GdkModifierType   modifiers);
-void          gdk_input_window_get_pointer   (GdkWindow        *window,
-                                             guint32           deviceid,
-                                             gdouble          *x,
-                                             gdouble          *y,
-                                             gdouble          *pressure,
-                                             gdouble          *xtilt,
-                                             gdouble          *ytilt,
-                                             GdkModifierType  *mask);
-GdkTimeCoord *gdk_input_motion_events        (GdkWindow        *window,
-                                             guint32           deviceid,
-                                             guint32           start,
-                                             guint32           stop,
-                                             gint             *nevents_return);
+/* Returns a list of GdkDevice * */      
+GList *        gdk_devices_list         (void);
+
+/* Functions to configure a device */
+void           gdk_device_set_source    (GdkDevice      *device,
+                                        GdkInputSource  source);
+         
+gboolean       gdk_device_set_mode      (GdkDevice      *device,
+                                        GdkInputMode    mode);
+
+void           gdk_device_set_key       (GdkDevice      *device,
+                                        guint           index,
+                                        guint           keyval,
+                                        GdkModifierType modifiers);
+
+void     gdk_device_set_axis_use (GdkDevice         *device,
+                                 guint              index,
+                                 GdkAxisUse         use);
+void     gdk_device_get_state    (GdkDevice         *device,
+                                 GdkWindow         *window,
+                                 gdouble           *axes,
+                                 GdkModifierType   *mask);
+gboolean gdk_device_get_history  (GdkDevice         *device,
+                                 GdkWindow         *window,
+                                 guint32            start,
+                                 guint32            stop,
+                                 GdkTimeCoord    ***events,
+                                 gint              *n_events);
+void     gdk_device_free_history (GdkTimeCoord     **events,
+                                 gint               n_events);
+gboolean gdk_device_get_axis     (GdkDevice         *device,
+                                 gdouble           *axes,
+                                 GdkAxisUse         use,
+                                 gdouble           *value);
+
+void gdk_input_set_extension_events (GdkWindow        *window,
+                                    gint              mask,
+                                    GdkExtensionMode  mode);
 
+extern GdkDevice *gdk_core_pointer;
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 0086247c004c7df4c8be9e8a809f85ea27a8f9b5..c6156c390ee5e6d4c94ec367a255f7ebfee14b3e 100644 (file)
@@ -283,10 +283,9 @@ gdk_event_translate (GdkEvent *event,
    *  some circumstances.
    */
   
-  if ((xevent->xany.window == None) &&
-      gdk_input_vtable.window_none_event)
+  if (xevent->xany.window == None)
     {
-      return_val = gdk_input_vtable.window_none_event (event,xevent);
+      return_val = _gdk_input_window_none_event (event, xevent);
       
       if (return_val >= 0)     /* was handled */
        return return_val;
@@ -517,12 +516,8 @@ gdk_event_translate (GdkEvent *event,
          event->scroll.y = xevent->xbutton.y + yoffset;
          event->scroll.x_root = (gfloat)xevent->xbutton.x_root;
          event->scroll.y_root = (gfloat)xevent->xbutton.y_root;
-         event->scroll.pressure = 0.5;
-         event->scroll.xtilt = 0;
-         event->scroll.ytilt = 0;
          event->scroll.state = (GdkModifierType) xevent->xbutton.state;
-         event->scroll.source = GDK_SOURCE_MOUSE;
-         event->scroll.deviceid = GDK_CORE_POINTER;
+         event->scroll.device = gdk_core_pointer;
        }
       else
        {
@@ -533,13 +528,10 @@ gdk_event_translate (GdkEvent *event,
          event->button.y = xevent->xbutton.y + yoffset;
          event->button.x_root = (gfloat)xevent->xbutton.x_root;
          event->button.y_root = (gfloat)xevent->xbutton.y_root;
-         event->button.pressure = 0.5;
-         event->button.xtilt = 0;
-         event->button.ytilt = 0;
+         event->button.axes = NULL;
          event->button.state = (GdkModifierType) xevent->xbutton.state;
          event->button.button = xevent->xbutton.button;
-         event->button.source = GDK_SOURCE_MOUSE;
-         event->button.deviceid = GDK_CORE_POINTER;
+         event->button.device = gdk_core_pointer;
          
          gdk_event_button_generate (event);
        }
@@ -575,13 +567,10 @@ gdk_event_translate (GdkEvent *event,
       event->button.y = xevent->xbutton.y + yoffset;
       event->button.x_root = (gfloat)xevent->xbutton.x_root;
       event->button.y_root = (gfloat)xevent->xbutton.y_root;
-      event->button.pressure = 0.5;
-      event->button.xtilt = 0;
-      event->button.ytilt = 0;
+      event->button.axes = NULL;
       event->button.state = (GdkModifierType) xevent->xbutton.state;
       event->button.button = xevent->xbutton.button;
-      event->button.source = GDK_SOURCE_MOUSE;
-      event->button.deviceid = GDK_CORE_POINTER;
+      event->button.device = gdk_core_pointer;
       
       break;
       
@@ -607,13 +596,10 @@ gdk_event_translate (GdkEvent *event,
       event->motion.y = xevent->xmotion.y + yoffset;
       event->motion.x_root = (gfloat)xevent->xmotion.x_root;
       event->motion.y_root = (gfloat)xevent->xmotion.y_root;
-      event->motion.pressure = 0.5;
-      event->motion.xtilt = 0;
-      event->motion.ytilt = 0;
+      event->motion.axes = NULL;
       event->motion.state = (GdkModifierType) xevent->xmotion.state;
       event->motion.is_hint = xevent->xmotion.is_hint;
-      event->motion.source = GDK_SOURCE_MOUSE;
-      event->motion.deviceid = GDK_CORE_POINTER;
+      event->motion.device = gdk_core_pointer;
       
       break;
       
@@ -627,9 +613,8 @@ gdk_event_translate (GdkEvent *event,
       /* Tell XInput stuff about it if appropriate */
       if (window_private &&
          !GDK_WINDOW_DESTROYED (window) &&
-         (window_private->extension_events != 0) &&
-         gdk_input_vtable.enter_event)
-       gdk_input_vtable.enter_event (&xevent->xcrossing, window);
+         window_private->extension_events != 0)
+       _gdk_input_enter_event (&xevent->xcrossing, window);
       
       event->crossing.type = GDK_ENTER_NOTIFY;
       event->crossing.window = window;
@@ -999,9 +984,8 @@ gdk_event_translate (GdkEvent *event,
                           : ""));
       if (window &&
          !GDK_WINDOW_DESTROYED (window) &&
-         (window_private->extension_events != 0) &&
-         gdk_input_vtable.configure_event)
-       gdk_input_vtable.configure_event (&xevent->xconfigure, window);
+         (window_private->extension_events != 0))
+       _gdk_input_configure_event (&xevent->xconfigure, window);
 
       if (!window || GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD)
        return_val = FALSE;
@@ -1180,9 +1164,8 @@ gdk_event_translate (GdkEvent *event,
       
       if (window_private &&
          !GDK_WINDOW_DESTROYED (window_private) &&
-         (window_private->extension_events != 0) &&
-         gdk_input_vtable.other_event)
-       return_val = gdk_input_vtable.other_event(event, xevent, window);
+         (window_private->extension_events != 0))
+       return_val = _gdk_input_other_event(event, xevent, window);
       else
        return_val = FALSE;
       
index b73b674fe5fae18acbf1f9036726cf075e224b5e..2f173ca161c6c3b079aebaddd8b6614eca9dee68 100644 (file)
 
 /* Forward declarations */
 static void gdk_input_gxi_select_notify (GdkDevicePrivate *gdkdev);
-static gint gdk_input_gxi_set_mode (guint32 deviceid, GdkInputMode mode);
-static gint gdk_input_is_extension_device (guint32 deviceid);
-static void gdk_input_gxi_configure_event (XConfigureEvent *xevent, 
-                                          GdkWindow *window);
-static void gdk_input_gxi_enter_event (XCrossingEvent *xevent, 
-                                      GdkWindow *window);
-static gint gdk_input_gxi_other_event (GdkEvent *event, 
-                                      XEvent *xevent, 
-                                      GdkWindow *window);
+static gint gdk_input_is_extension_device (GdkDevicePrivate *device_private);
 static void gdk_input_gxi_update_device (GdkDevicePrivate *gdkdev);
 
-static gint gdk_input_gxi_window_none_event (GdkEvent *event, XEvent *xevent);
-static gint gdk_input_gxi_enable_window (GdkWindow *window, 
-                                        GdkDevicePrivate *gdkdev);
-static gint gdk_input_gxi_disable_window (GdkWindow *window, 
-                                         GdkDevicePrivate *gdkdev);
 static Window gdk_input_find_root_child(Display *dpy, Window w);
 static void gdk_input_compute_obscuring(GdkInputWindow *input_window);
 static gint gdk_input_is_obscured(GdkInputWindow *input_window, gdouble x, 
                                  gdouble y);
-static GdkTimeCoord *gdk_input_gxi_motion_events (GdkWindow *window,
-                                                 guint32 deviceid,
-                                                 guint32 start,
-                                                 guint32 stop,
-                                                 gint *nevents_return);
-static void gdk_input_gxi_get_pointer (GdkWindow       *window,
-                                      guint32     deviceid,
-                                      gdouble         *x,
-                                      gdouble         *y,
-                                      gdouble         *pressure,
-                                      gdouble         *xtilt,
-                                      gdouble         *ytilt,
-                                      GdkModifierType *mask);
-static gint gdk_input_gxi_grab_pointer (GdkWindow *     window,
-                                       gint            owner_events,
-                                       GdkEventMask    event_mask,
-                                       GdkWindow *     confine_to,
-                                       guint32         time);
-static void gdk_input_gxi_ungrab_pointer (guint32 time);
 
 /* Local variables */
 
@@ -85,20 +53,6 @@ gdk_input_init(void)
 {
   GList *tmp_list;
   
-  gdk_input_vtable.set_mode           = gdk_input_gxi_set_mode;
-  gdk_input_vtable.set_axes           = gdk_input_common_set_axes;
-  gdk_input_vtable.set_key            = gdk_input_common_set_key;
-  gdk_input_vtable.motion_events      = gdk_input_gxi_motion_events;
-  gdk_input_vtable.get_pointer       = gdk_input_gxi_get_pointer;
-  gdk_input_vtable.grab_pointer              = gdk_input_gxi_grab_pointer;
-  gdk_input_vtable.ungrab_pointer     = gdk_input_gxi_ungrab_pointer;
-  gdk_input_vtable.configure_event    = gdk_input_gxi_configure_event;
-  gdk_input_vtable.enter_event        = gdk_input_gxi_enter_event;
-  gdk_input_vtable.other_event        = gdk_input_gxi_other_event;
-  gdk_input_vtable.window_none_event  = gdk_input_gxi_window_none_event;
-  gdk_input_vtable.enable_window      = gdk_input_gxi_enable_window;
-  gdk_input_vtable.disable_window     = gdk_input_gxi_disable_window;
-
   gdk_input_ignore_core = FALSE;
   gdk_input_core_pointer = NULL;
 
@@ -120,13 +74,13 @@ gdk_input_init(void)
   for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next) 
     {
       GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)tmp_list->data;
-      if (gdk_input_is_extension_device(gdkdev->info.deviceid))
+      if (gdk_input_is_extension_device (gdkdev))
        {
          gdk_input_gxi_select_notify (gdkdev);
        }
       else
        {
-         if (gdkdev->info.deviceid != GDK_CORE_POINTER)
+         if (!GDK_IS_CORE (gdkdev))
            gdk_input_core_pointer = gdkdev;
        }
     }
@@ -146,19 +100,26 @@ gdk_input_gxi_select_notify (GdkDevicePrivate *gdkdev)
 static gint
 gdk_input_gxi_set_core_pointer(GdkDevicePrivate *gdkdev)
 {
-  int x_axis,y_axis;
+  gint x_axis = -1;
+  gint y_axis = -1;
+  gint i;
 
   g_return_val_if_fail(gdkdev->xdevice,FALSE);
 
-  x_axis = gdkdev->axis_for_use[GDK_AXIS_X];
-  y_axis = gdkdev->axis_for_use[GDK_AXIS_Y];
-
-  g_return_val_if_fail(x_axis != -1 && y_axis != -1,FALSE);
+  for (i=0; i<gdkdev->info.num_axes; i++)
+    {
+      if (gdkdev->info.axes[i].use == GDK_AXIS_X)
+       x_axis = i;
+      else if (gdkdev->info.axes[i].use == GDK_AXIS_Y)
+       y_axis = i;
+    }
+  
+  g_return_val_if_fail (x_axis != -1 && y_axis != -1,FALSE);
 
   /* core_pointer might not be up to date so we check with the server
      before change the pointer */
 
-  if ( !gdk_input_is_extension_device(gdkdev->info.deviceid) )
+  if (!gdk_input_is_extension_device (gdkdev))
     {
 #if 0
       if (gdkdev != gdk_input_core_pointer)
@@ -181,24 +142,27 @@ gdk_input_gxi_set_core_pointer(GdkDevicePrivate *gdkdev)
 }
 
 
-/* FIXME, merge with gdk_input_xfree_set_mode */
+/* FIXME, merge with the XFree implementation */
 
-static gint
-gdk_input_gxi_set_mode (guint32 deviceid, GdkInputMode mode)
+gboolean
+gdk_device_set_mode (GdkDevice      *device,
+                    GdkInputMode    mode)
 {
   GList *tmp_list;
   GdkDevicePrivate *gdkdev;
   GdkInputMode old_mode;
   GdkInputWindow *input_window;
 
-  gdkdev = gdk_input_find_device(deviceid);
-  g_return_val_if_fail (gdkdev != NULL,FALSE);
-  old_mode = gdkdev->info.mode;
+  if (GDK_IS_CORE (device))
+    return FALSE;
+
+  gdkdev = (GdkDevicePrivate *)device;
 
-  if (gdkdev->info.mode == mode)
+  if (device->mode == mode)
     return TRUE;
-  
-  gdkdev->info.mode = mode;
+
+  old_mode = device->mode;
+  device->mode = mode;
 
   if (old_mode != GDK_MODE_DISABLED)
     {
@@ -206,7 +170,7 @@ gdk_input_gxi_set_mode (guint32 deviceid, GdkInputMode mode)
        {
          input_window = (GdkInputWindow *)tmp_list->data;
          if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
-           gdk_input_disable_window (input_window->window, gdkdev);
+           _gdk_input_disable_window (input_window->window, gdkdev);
        }
     }
   
@@ -216,31 +180,31 @@ gdk_input_gxi_set_mode (guint32 deviceid, GdkInputMode mode)
        {
          input_window = (GdkInputWindow *)tmp_list->data;
          if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
-           if (!gdk_input_enable_window(input_window->window, gdkdev))
+           if (!_gdk_input_enable_window(input_window->window, gdkdev))
              {
-               gdk_input_set_mode(deviceid, old_mode);
+               gdk_device_set_mode (device, old_mode);
                return FALSE;
              }
        }
     }
 
   return TRUE;
-
 }
 
 gint
-gdk_input_is_extension_device (guint32 deviceid)
+gdk_input_is_extension_device (GdkDevicePrivate *private)
 {
   XDeviceInfo   *devices;
   int num_devices, loop;
 
-  if (deviceid == GDK_CORE_POINTER)
+  if (GDK_IS_CORE (private))
     return FALSE;
   
   devices = XListInputDevices(gdk_display, &num_devices);
   for(loop=0; loop<num_devices; loop++)
     {
-      if ((devices[loop].id == deviceid) && (devices[loop].use == IsXExtensionDevice)) 
+      if ((devices[loop].id == private->deviceid) &&
+         (devices[loop].use == IsXExtensionDevice)) 
        {
          XFreeDeviceList(devices);
          return TRUE;
@@ -251,8 +215,8 @@ gdk_input_is_extension_device (guint32 deviceid)
   return FALSE;
 }
 
-static void
-gdk_input_gxi_configure_event (XConfigureEvent *xevent, GdkWindow *window)
+void
+_gdk_input_configure_event (XConfigureEvent *xevent, GdkWindow *window)
 {
   GdkInputWindow *input_window;
   gint root_x, root_y;
@@ -267,8 +231,8 @@ gdk_input_gxi_configure_event (XConfigureEvent *xevent, GdkWindow *window)
   gdk_input_compute_obscuring(input_window);
 }
 
-static void
-gdk_input_gxi_enter_event (XCrossingEvent *xevent, GdkWindow *window)
+void
+_gdk_input_enter_event (XCrossingEvent *xevent, GdkWindow *window)
 {
   GdkInputWindow *input_window;
 
@@ -278,28 +242,32 @@ gdk_input_gxi_enter_event (XCrossingEvent *xevent, GdkWindow *window)
   gdk_input_compute_obscuring(input_window);
 }
 
-static gint 
-gdk_input_gxi_other_event (GdkEvent *event, 
+gint
+_gdk_input_other_event (GdkEvent *event, 
                           XEvent *xevent, 
                           GdkWindow *window)
 {
   GdkInputWindow *input_window;
-
+  GdkWindowImplX11 *impl;
+  
   GdkDevicePrivate *gdkdev;
   gint return_val;
 
   input_window = gdk_input_window_find(window);
   g_return_val_if_fail (window != NULL, -1);
 
+  impl = GDK_WINDOW_IMPL_X11 (((GdkWindowObject *) input_window->window)->impl);
+
   /* This is a sort of a hack, as there isn't any XDeviceAnyEvent -
      but it's potentially faster than scanning through the types of
      every device. If we were deceived, then it won't match any of
      the types for the device anyways */
   gdkdev = gdk_input_find_device(((XDeviceButtonEvent *)xevent)->deviceid);
 
-  if (!gdkdev) {
-    return -1;                 /* we don't handle it - not an XInput event */
-  }
+  if (!gdkdev)
+    {
+      return -1;                       /* we don't handle it - not an XInput event */
+    }
 
   if (gdkdev->info.mode == GDK_MODE_DISABLED ||
       input_window->mode == GDK_EXTENSION_EVENTS_CURSOR)
@@ -317,8 +285,8 @@ gdk_input_gxi_other_event (GdkEvent *event,
   if (return_val > 0 && event->type == GDK_MOTION_NOTIFY &&
       (!gdkdev->button_state) && (!input_window->grabbed) &&
       ((event->motion.x < 0) || (event->motion.y < 0) ||
-       (event->motion.x > ((GdkDrawablePrivate *)window)->width) || 
-       (event->motion.y > ((GdkDrawablePrivate *)window)->height) ||
+       (event->motion.x > impl->width) || 
+       (event->motion.y > impl->height) ||
        gdk_input_is_obscured(input_window,event->motion.x,event->motion.y)))
     {
 #ifdef DEBUG_SWITCHING
@@ -341,11 +309,11 @@ gdk_input_gxi_update_device (GdkDevicePrivate *gdkdev)
 {
   GList *t;
 
-  if (gdk_input_is_extension_device (gdkdev->info.deviceid))
+  if (gdk_input_is_extension_device (gdkdev))
     {
       if (!gdkdev->xdevice)
        {
-         gdkdev->xdevice = XOpenDevice(gdk_display, gdkdev->info.deviceid);
+         gdkdev->xdevice = XOpenDevice(gdk_display, gdkdev->deviceid);
          gdk_input_gxi_select_notify (gdkdev);
          gdkdev->needs_update = 1;
        }
@@ -359,8 +327,8 @@ gdk_input_gxi_update_device (GdkDevicePrivate *gdkdev)
     }
 }
 
-static gint 
-gdk_input_gxi_window_none_event (GdkEvent *event, XEvent *xevent)
+gint
+_gdk_input_window_none_event (GdkEvent *event, XEvent *xevent)
 {
   GdkDevicePrivate *gdkdev = 
     gdk_input_find_device(((XDeviceButtonEvent *)xevent)->deviceid);
@@ -386,8 +354,8 @@ gdk_input_gxi_window_none_event (GdkEvent *event, XEvent *xevent)
   return FALSE;
 }
 
-static gint
-gdk_input_gxi_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
+gboolean
+_gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
 {
   GdkInputWindow *input_window;
 
@@ -397,7 +365,7 @@ gdk_input_gxi_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
   if (!gdkdev->claimed)
     {
       if (gxid_claim_device(gdk_input_gxid_host, gdk_input_gxid_port,
-                           gdkdev->info.deviceid,
+                           gdkdev->deviceid,
                            GDK_WINDOW_XWINDOW(window), FALSE) !=
          GXID_RETURN_OK)
        {
@@ -415,8 +383,8 @@ gdk_input_gxi_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
   return TRUE;
 }
 
-static gint
-gdk_input_gxi_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
+gboolean
+_gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
 {
   GdkInputWindow *input_window;
 
@@ -426,7 +394,7 @@ gdk_input_gxi_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
   if (gdkdev->claimed)
     {
       gxid_release_device(gdk_input_gxid_host, gdk_input_gxid_port,
-                         gdkdev->info.deviceid,
+                         gdkdev->deviceid,
                          GDK_WINDOW_XWINDOW(window));
 
       gdkdev->claimed = FALSE;
@@ -478,7 +446,7 @@ gdk_input_find_root_child(Display *dpy, Window w)
   return w;
 }
 
-void
+static void
 gdk_input_compute_obscuring(GdkInputWindow *input_window)
 {
   int i;
@@ -549,57 +517,12 @@ gdk_input_compute_obscuring(GdkInputWindow *input_window)
     XFree(children);
 }
 
-static void 
-gdk_input_gxi_get_pointer     (GdkWindow       *window,
-                              guint32     deviceid,
-                              gdouble         *x,
-                              gdouble         *y,
-                              gdouble         *pressure,
-                              gdouble         *xtilt,
-                              gdouble         *ytilt,
-                              GdkModifierType *mask)
-{
-  GdkDevicePrivate *gdkdev;
-
-  gdkdev = gdk_input_find_device (deviceid);
-  g_return_if_fail (gdkdev != NULL);
-
-  if (gdkdev == gdk_input_core_pointer)
-    gdk_input_common_get_pointer (window, GDK_CORE_POINTER, x, y,
-                                 pressure, xtilt, ytilt, mask);
-  else
-    gdk_input_common_get_pointer (window, deviceid, x, y,
-                                 pressure, xtilt, ytilt, mask);
-}
-
-static GdkTimeCoord *
-gdk_input_gxi_motion_events (GdkWindow *window,
-                            guint32 deviceid,
-                            guint32 start,
-                            guint32 stop,
-                            gint *nevents_return)
-{
-  GdkDevicePrivate *gdkdev;
-
-  gdkdev = gdk_input_find_device (deviceid);
-  g_return_val_if_fail (gdkdev != NULL, NULL);
-  
-
-  if (gdkdev == gdk_input_core_pointer)
-    return gdk_input_motion_events (window, GDK_CORE_POINTER, start, stop,
-                                   nevents_return);
-  else
-    return gdk_input_common_motion_events (window, deviceid, start, stop,
-                                          nevents_return);
-  
-}
-
-static gint 
-gdk_input_gxi_grab_pointer (GdkWindow *     window,
-                           gint            owner_events,
-                           GdkEventMask    event_mask,
-                           GdkWindow *     confine_to,
-                           guint32         time)
+gint 
+_gdk_input_grab_pointer (GdkWindow *     window,
+                        gint            owner_events,
+                        GdkEventMask    event_mask,
+                        GdkWindow *     confine_to,
+                        guint32         time)
 {
   GList *tmp_list;
   GdkInputWindow *input_window;
@@ -622,7 +545,7 @@ gdk_input_gxi_grab_pointer (GdkWindow *     window,
   while (tmp_list)
     {
       gdkdev = (GdkDevicePrivate *)tmp_list->data;
-      if (gdkdev->info.deviceid != GDK_CORE_POINTER && 
+      if (!GDK_IS_CORE (gdkdev) && 
          gdkdev->xdevice &&
          (gdkdev->button_state != 0))
        gdkdev->button_state = 0;
@@ -633,8 +556,8 @@ gdk_input_gxi_grab_pointer (GdkWindow *     window,
   return Success;
 }
 
-static void 
-gdk_input_gxi_ungrab_pointer (guint32 time)
+void 
+_gdk_input_ungrab_pointer (guint32 time)
 {
   GdkInputWindow *input_window;
   GList *tmp_list;
index d3aba3dd93f3cce8649dc7cd09e17505d678af69..4c7cf705ed2f5dbdb44ee66f604a3262e073b09b 100644 (file)
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
-static void gdk_input_none_get_pointer (GdkWindow       *window,
-                                       guint32   deviceid,
-                                       gdouble         *x,
-                                       gdouble         *y,
-                                       gdouble         *pressure,
-                                       gdouble         *xtilt,
-                                       gdouble         *ytilt,
-                                       GdkModifierType *mask);
-
 void
 gdk_input_init (void)
 {
-  gdk_input_vtable.set_mode           = NULL;
-  gdk_input_vtable.set_axes           = NULL;
-  gdk_input_vtable.set_key            = NULL;
-  gdk_input_vtable.motion_events      = NULL;
-  gdk_input_vtable.get_pointer        = gdk_input_none_get_pointer;
-  gdk_input_vtable.grab_pointer       = NULL;
-  gdk_input_vtable.ungrab_pointer     = NULL;
-  gdk_input_vtable.configure_event    = NULL;
-  gdk_input_vtable.enter_event        = NULL;
-  gdk_input_vtable.other_event        = NULL;
-  gdk_input_vtable.window_none_event  = NULL;
-  gdk_input_vtable.enable_window      = NULL;
-  gdk_input_vtable.disable_window     = NULL;
-
-  gdk_input_devices = g_list_append (NULL, (GdkDeviceInfo *) &gdk_input_core_info);
+  gdk_input_devices = g_list_append (NULL, gdk_core_pointer);
 
   gdk_input_ignore_core = FALSE;
 }
 
-static void
-gdk_input_none_get_pointer (GdkWindow       *window,
-                           guint32          deviceid,
-                           gdouble         *x,
-                           gdouble         *y,
-                           gdouble         *pressure,
-                           gdouble         *xtilt,
-                           gdouble         *ytilt,
-                           GdkModifierType *mask)
+void 
+gdk_device_get_state (GdkDevice       *device,
+                     GdkWindow       *window,
+                     gdouble         *axes,
+                     GdkModifierType *mask)
 {
   gint x_int, y_int;
 
+  g_return_if_fail (device != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
   gdk_window_get_pointer (window, &x_int, &y_int, mask);
 
-  if (x) *x = x_int;
-  if (y) *y = y_int;
-  if (pressure) *pressure = 0.5;
-  if (xtilt) *xtilt = 0;
-  if (ytilt) *ytilt = 0;
+  if (axes)
+    {
+      axes[0] = x_int;
+      axes[1] = y_int;
+    }
+}
+
+gboolean
+_gdk_device_get_history (GdkDevice         *device,
+                        GdkWindow         *window,
+                        guint32            start,
+                        guint32            stop,
+                        GdkTimeCoord    ***events,
+                        gint              *n_events)
+{
+  g_warning ("gdk_device_get_history() called for invalid device");
+  return FALSE;
+}
+
+gboolean
+_gdk_input_enable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
+{
+  return TRUE;
+}
+
+gboolean
+_gdk_input_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
+{
+  return TRUE;
+}
+
+gint 
+_gdk_input_window_none_event (GdkEvent         *event,
+                            XEvent           *xevent)
+{
+  return -1;
 }
+
+gint 
+_gdk_input_other_event (GdkEvent *event, 
+                       XEvent *xevent, 
+                       GdkWindow *window)
+{
+  return -1;
+}
+
+void
+_gdk_input_configure_event (XConfigureEvent *xevent,
+                           GdkWindow       *window)
+{
+}
+
+void 
+_gdk_input_enter_event (XCrossingEvent *xevent, 
+                       GdkWindow      *window)
+{
+}
+
+gint 
+_gdk_input_grab_pointer (GdkWindow *     window,
+                        gint            owner_events,
+                        GdkEventMask    event_mask,
+                        GdkWindow *     confine_to,
+                        guint32         time)
+{
+  return Success;
+}
+
+void
+_gdk_input_ungrab_pointer (guint32         time)
+{
+}
+
+gboolean
+gdk_device_set_mode (GdkDevice   *device,
+                    GdkInputMode mode)
+{
+  return FALSE;
+}
+
index 1e1c501e9e0fb84f6679389030109aadccfc8161..c3c245a345e4d394ce0b4833569e4d0e626ecb7f 100644 (file)
@@ -27,6 +27,7 @@
 #include "gdkinputprivate.h"
 #include "gdkinternals.h"
 #include "gdkx.h"
+#include "gdk.h"               /* For gdk_error_trap_push()/pop() */
 
 #include <string.h>
 
 static GdkDevicePrivate *gdk_input_device_new(XDeviceInfo *device, 
                                              gint include_core);
 static void gdk_input_translate_coordinates(GdkDevicePrivate *gdkdev,
-                                           GdkInputWindow *input_window,
-                                           gint *axis_data,
-                                           gdouble *x, gdouble *y,
-                                           gdouble *pressure,
-                                           gdouble *xtilt, gdouble *ytilt);
+                                           GdkInputWindow   *input_window,
+                                           gint             *axis_data,
+                                           gdouble          *axis_out,
+                                           gdouble          *x_out,
+                                           gdouble          *y_out);
 static guint gdk_input_translate_state(guint state, guint device_state);
-void  gdk_input_common_get_pointer     (GdkWindow       *window,
-                                       guint32    deviceid,
-                                       gdouble         *x,
-                                       gdouble         *y,
-                                       gdouble         *pressure,
-                                       gdouble         *xtilt,
-                                       gdouble         *ytilt,
-                                       GdkModifierType *mask);
 
 /* Global variables */
 
-static gint gdk_input_root_width;
-static gint gdk_input_root_height;
+GdkDevicePrivate *
+gdk_input_find_device (guint32 id)
+{
+  GList *tmp_list = gdk_input_devices;
+  GdkDevicePrivate *gdkdev;
+  while (tmp_list)
+    {
+      gdkdev = (GdkDevicePrivate *)(tmp_list->data);
+      if (gdkdev->deviceid == id)
+       return gdkdev;
+      tmp_list = tmp_list->next;
+    }
+  return NULL;
+}
 
 void
 gdk_input_get_root_relative_geometry(Display *dpy, Window w, int *x_ret, int *y_ret,
-                              int *width_ret, int *height_ret)
+                                    int *width_ret, int *height_ret)
 {
-  Window root,parent;
+  Window root, parent, child;
   Window *children;
   guint nchildren;
   gint x,y;
   guint width, height;
-  gint xc,yc;
-  guint widthc,heightc,border_widthc,depthc;
+  guint border_widthc, depthc;
+   
+  XQueryTree (dpy, w, &root, &parent, &children, &nchildren);
+  if (children)
+    XFree(children);
   
-  XQueryTree(dpy,w,&root,&parent,&children,&nchildren);
-  if (children) XFree(children);
-  XGetGeometry(dpy,w,&root,&x,&y,&width,&height,&border_widthc,
-              &depthc);
-  x += border_widthc;
-  y += border_widthc;
-
-  while (root != parent)
-    {
-      w = parent;
-      XQueryTree(dpy,w,&root,&parent,&children,&nchildren);
-      if (children) XFree(children);
-      XGetGeometry(dpy,w,&root,&xc,&yc,&widthc,&heightc,
-                  &border_widthc,&depthc);
-      x += xc + border_widthc;
-      y += yc + border_widthc;
-    }
+  XGetGeometry (dpy, w, &root, &x, &y, &width, &height, &border_widthc, &depthc);
 
+  XTranslateCoordinates (dpy, w, root, 0, 0, &x, &y, &child);
   if (x_ret)
     *x_ret = x;
   if (y_ret)
@@ -95,26 +89,22 @@ gdk_input_get_root_relative_geometry(Display *dpy, Window w, int *x_ret, int *y_
 }
 
 static GdkDevicePrivate *
-gdk_input_device_new(XDeviceInfo *device, gint include_core)
+gdk_input_device_new (XDeviceInfo *device, gint include_core)
 {
   GdkDevicePrivate *gdkdev;
-  gchar *tmp_name, *p;
+  gchar *tmp_name;
   XAnyClassPtr class;
   gint i,j;
 
   gdkdev = g_new(GdkDevicePrivate,1);
 
-  gdkdev->info.deviceid = device->id;
-  if (device->name[0]) {
-    gdkdev->info.name = g_new(char, strlen(device->name)+1);
-    strcpy(gdkdev->info.name,device->name);
-  } else {
-    /* XFree86 3.2 gives an empty name to the default core devices,
-       (fixed in 3.2A) */
-    gdkdev->info.name = g_strdup("pointer");
-    strcpy(gdkdev->info.name,"pointer");
-    gdkdev->info.source = GDK_SOURCE_MOUSE;
-  }
+  gdkdev->deviceid = device->id;
+  if (device->name[0])
+    gdkdev->info.name = g_strdup (device->name);
+ else
+   /* XFree86 3.2 gives an empty name to the default core devices,
+      (fixed in 3.2A) */
+   gdkdev->info.name = g_strdup ("pointer");
 
   gdkdev->info.mode = GDK_MODE_DISABLED;
 
@@ -122,12 +112,8 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core)
      could invite a very, very, long list... Lowercase name
      for comparison purposes */
 
-  tmp_name = g_strdup(gdkdev->info.name);
-  for (p = tmp_name; *p; p++)
-    {
-      if (*p >= 'A' && *p <= 'Z')
-       *p += 'a' - 'A';
-    }
+  tmp_name = g_strdup (gdkdev->info.name);
+  g_strdown (tmp_name);
   
   if (!strcmp (tmp_name, "pointer"))
     gdkdev->info.source = GDK_SOURCE_MOUSE;
@@ -162,9 +148,7 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core)
     {
       switch (class->class) {
       case ButtonClass:
-       {
-         break;
-       }
+       break;
       case KeyClass:
        {
          XKeyInfo *xki = (XKeyInfo *)class;
@@ -195,8 +179,8 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core)
        {
          XValuatorInfo *xvi = (XValuatorInfo *)class;
          gdkdev->info.num_axes = xvi->num_axes;
-         gdkdev->axes = g_new(GdkAxisInfo, xvi->num_axes);
-         gdkdev->info.axes = g_new(GdkAxisUse, xvi->num_axes);
+         gdkdev->axes = g_new (GdkAxisInfo, xvi->num_axes);
+         gdkdev->info.axes = g_new0 (GdkDeviceAxis, xvi->num_axes);
          for (j=0;j<xvi->num_axes;j++)
            {
              gdkdev->axes[j].resolution = 
@@ -205,27 +189,21 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core)
                gdkdev->axes[j].xmin_value = xvi->axes[j].min_value;
              gdkdev->axes[j].max_value =
                gdkdev->axes[j].xmax_value = xvi->axes[j].max_value;
-             gdkdev->info.axes[j] = GDK_AXIS_IGNORE;
+             gdkdev->info.axes[j].use = GDK_AXIS_IGNORE;
            }
          j=0;
          if (j<xvi->num_axes)
-           gdkdev->info.axes[j++] = GDK_AXIS_X;
+           gdk_device_set_axis_use (&gdkdev->info, j++, GDK_AXIS_X);
          if (j<xvi->num_axes)
-           gdkdev->info.axes[j++] = GDK_AXIS_Y;
+           gdk_device_set_axis_use (&gdkdev->info, j++, GDK_AXIS_Y);
          if (j<xvi->num_axes)
-           gdkdev->info.axes[j++] = GDK_AXIS_PRESSURE;
+           gdk_device_set_axis_use (&gdkdev->info, j++, GDK_AXIS_PRESSURE);
          if (j<xvi->num_axes)
-           gdkdev->info.axes[j++] = GDK_AXIS_XTILT;
+           gdk_device_set_axis_use (&gdkdev->info, j++, GDK_AXIS_XTILT);
          if (j<xvi->num_axes)
-           gdkdev->info.axes[j++] = GDK_AXIS_YTILT;
-         
-         /* set up reverse lookup on axis use */
-         for (j=GDK_AXIS_IGNORE;j<GDK_AXIS_LAST;j++)
-           gdkdev->axis_for_use[j] = -1;
-         
-         for (j=0;j<xvi->num_axes;j++)
-           if (gdkdev->info.axes[j] != GDK_AXIS_IGNORE)
-             gdkdev->axis_for_use[gdkdev->info.axes[j]] = j;
+           gdk_device_set_axis_use (&gdkdev->info, j++, GDK_AXIS_YTILT);
+         if (j<xvi->num_axes)
+           gdk_device_set_axis_use (&gdkdev->info, j++, GDK_AXIS_WHEEL);
                       
          break;
        }
@@ -235,41 +213,16 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core)
   /* return NULL if no axes */
   if (!gdkdev->info.num_axes || !gdkdev->axes ||
       (!include_core && device->use == IsXPointer))
-    {
-      g_free(gdkdev->info.name);
-      if (gdkdev->axes)
-       g_free(gdkdev->axes);
-      if (gdkdev->info.keys)
-       g_free(gdkdev->info.keys);
-      if (gdkdev->info.axes)
-       g_free (gdkdev->info.axes);
-      g_free(gdkdev);
-      return NULL;
-    }
+    goto error;
 
   if (device->use != IsXPointer)
     {
-      int error_warn = gdk_error_warnings;
-
-      gdk_error_warnings = 0;
-      gdk_error_code = 0;
-      gdkdev->xdevice = XOpenDevice(gdk_display, gdkdev->info.deviceid);
-      gdk_error_warnings = error_warn;
+      gdk_error_trap_push ();
+      gdkdev->xdevice = XOpenDevice(gdk_display, gdkdev->deviceid);
 
       /* return NULL if device is not ready */
-      if (gdk_error_code)
-       {
-         g_free (gdkdev->info.name);
-         if (gdkdev->axes)
-           g_free (gdkdev->axes);
-         if (gdkdev->info.keys)
-           g_free (gdkdev->info.keys);
-         if (gdkdev->info.axes)
-           g_free (gdkdev->info.axes);
-         g_free (gdkdev);
-
-         return NULL;
-       }
+      if (gdk_error_trap_pop ())
+       goto error;
     }
 
   gdkdev->buttonpress_type = 0;
@@ -282,6 +235,19 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core)
   gdkdev->changenotify_type = 0;
 
   return gdkdev;
+
+ error:
+
+  g_free (gdkdev->info.name);
+  if (gdkdev->axes)
+    g_free (gdkdev->axes);
+  if (gdkdev->info.keys)
+    g_free (gdkdev->info.keys);
+  if (gdkdev->info.axes)
+    g_free (gdkdev->info.axes);
+  g_free (gdkdev);
+  
+  return NULL;
 }
 
 void
@@ -414,12 +380,6 @@ gdk_input_common_init(gint include_core)
   int num_extensions, loop;
   Display *display = gdk_display;
 
-  /* Init global vars */
-  gdk_window_get_geometry(NULL,        /* use root window */
-                         NULL,NULL,
-                         &gdk_input_root_width,&gdk_input_root_height, 
-                         NULL);
-
   /* Init XInput extension */
   
   extensions = XListExtensions(display, &num_extensions);
@@ -443,33 +403,44 @@ gdk_input_common_init(gint include_core)
       XFreeDeviceList(devices);
     }
 
-  gdk_input_devices = g_list_append (gdk_input_devices, (gpointer)&gdk_input_core_info);
+  gdk_input_devices = g_list_append (gdk_input_devices, gdk_core_pointer);
 
   return TRUE;
 }
 
 static void
 gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
-                                GdkInputWindow *input_window,
-                                gint *axis_data,
-                                gdouble *x, gdouble *y, gdouble *pressure,
-                                gdouble *xtilt, gdouble *ytilt)
+                                GdkInputWindow   *input_window,
+                                gint             *axis_data,
+                                gdouble          *axis_out,
+                                gdouble          *x_out,
+                                gdouble          *y_out)
 {
   GdkWindowImplX11 *impl;
-
-  int x_axis, y_axis, pressure_axis, xtilt_axis, ytilt_axis;
+  int i;
+  int x_axis = 0;
+  int y_axis = 0;
 
   double device_width, device_height;
   double x_offset, y_offset, x_scale, y_scale;
 
   impl = GDK_WINDOW_IMPL_X11 (((GdkWindowObject *) input_window->window)->impl);
 
-  x_axis = gdkdev->axis_for_use[GDK_AXIS_X];
-  y_axis = gdkdev->axis_for_use[GDK_AXIS_Y];
-  pressure_axis = gdkdev->axis_for_use[GDK_AXIS_PRESSURE];
-  xtilt_axis = gdkdev->axis_for_use[GDK_AXIS_XTILT];
-  ytilt_axis = gdkdev->axis_for_use[GDK_AXIS_YTILT];
-
+  for (i=0; i<gdkdev->info.num_axes; i++)
+    {
+      switch (gdkdev->info.axes[i].use)
+       {
+       case GDK_AXIS_X:
+         x_axis = i;
+         break;
+       case GDK_AXIS_Y:
+         y_axis = i;
+         break;
+       default:
+         break;
+       }
+    }
+  
   device_width = gdkdev->axes[x_axis].max_value - 
                   gdkdev->axes[x_axis].min_value;
   device_height = gdkdev->axes[y_axis].max_value - 
@@ -477,8 +448,8 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
 
   if (gdkdev->info.mode == GDK_MODE_SCREEN) 
     {
-      x_scale = gdk_input_root_width / device_width;
-      y_scale = gdk_input_root_height / device_height;
+      x_scale = gdk_screen_width() / device_width;
+      y_scale = gdk_screen_height() / device_height;
 
       x_offset = - input_window->root_x;
       y_offset = - input_window->root_y;
@@ -510,54 +481,37 @@ gdk_input_translate_coordinates (GdkDevicePrivate *gdkdev,
          x_offset = - (device_width * x_scale - impl->width)/2;
        }
     }
-  
-  if (x) *x = x_offset + x_scale*axis_data[x_axis];
-  if (y) *y = y_offset + y_scale*axis_data[y_axis];
 
-  if (pressure)
-    {
-      if (pressure_axis != -1)
-       *pressure = ((double)axis_data[pressure_axis] 
-                    - gdkdev->axes[pressure_axis].min_value) 
-         / (gdkdev->axes[pressure_axis].max_value 
-            - gdkdev->axes[pressure_axis].min_value);
-      else
-       *pressure = 0.5;
-    }
-
-  if (xtilt)
-    {
-      if (xtilt_axis != -1)
-       {
-         *xtilt = 2. * (double)(axis_data[xtilt_axis] - 
-                                (gdkdev->axes[xtilt_axis].min_value +
-                                 gdkdev->axes[xtilt_axis].max_value)/2) /
-           (gdkdev->axes[xtilt_axis].max_value -
-            gdkdev->axes[xtilt_axis].min_value);
-       }
-      else *xtilt = 0;
-    }
-  
-  if (ytilt)
+  for (i=0; i<gdkdev->info.num_axes; i++)
     {
-      if (ytilt_axis != -1)
+      switch (gdkdev->info.axes[i].use)
        {
-         *ytilt = 2. * (double)(axis_data[ytilt_axis] - 
-                                (gdkdev->axes[ytilt_axis].min_value +
-                                 gdkdev->axes[ytilt_axis].max_value)/2) /
-           (gdkdev->axes[ytilt_axis].max_value -
-            gdkdev->axes[ytilt_axis].min_value);
+       case GDK_AXIS_X:
+         axis_out[i] = x_offset + x_scale*axis_data[x_axis];
+         if (x_out)
+           *x_out = axis_out[i];
+         break;
+       case GDK_AXIS_Y:
+         axis_out[i] = y_offset + y_scale*axis_data[y_axis];
+         if (y_out)
+           *y_out = axis_out[i];
+         break;
+       default:
+         axis_out[i] =
+           (gdkdev->info.axes[i].max * (axis_data[i] - gdkdev->axes[i].min_value) +
+            gdkdev->info.axes[i].min * (gdkdev->axes[i].max_value - axis_data[i])) /
+           (gdkdev->axes[i].max_value - gdkdev->axes[i].min_value);
+         break;
        }
-      else
-       *ytilt = 0;
     }
 }
 
 /* combine the state of the core device and the device state
-   into one - for now we do this in a simple-minded manner -
-   we just take the keyboard portion of the core device and
-   the button portion (all of?) the device state.
-   Any button remapping should go on here. */
+ * into one - for now we do this in a simple-minded manner -
+ * we just take the keyboard portion of the core device and
+ * the button portion (all of?) the device state.
+ * Any button remapping should go on here.
+ */
 static guint
 gdk_input_translate_state(guint state, guint device_state)
 {
@@ -586,16 +540,14 @@ gdk_input_common_other_event (GdkEvent         *event,
          event->button.type = GDK_BUTTON_RELEASE;
          gdkdev->button_state &= ~(1 << xdbe->button);
        }
+      event->button.device = &gdkdev->info;
       event->button.window = input_window->window;
       event->button.time = xdbe->time;
-      event->button.source = gdkdev->info.source;
-      event->button.deviceid = xdbe->deviceid;
 
+      event->button.axes = g_new (gdouble, gdkdev->info.num_axes);
       gdk_input_translate_coordinates (gdkdev,input_window, xdbe->axis_data,
-                                      &event->button.x,&event->button.y,
-                                      &event->button.pressure,
-                                      &event->button.xtilt, 
-                                      &event->button.ytilt);
+                                      event->button.axes, 
+                                      &event->button.x,&event->button.y);
       event->button.state = gdk_input_translate_state(xdbe->state,xdbe->device_state);
       event->button.button = xdbe->button;
 
@@ -674,21 +626,19 @@ gdk_input_common_other_event (GdkEvent         *event,
     {
       XDeviceMotionEvent *xdme = (XDeviceMotionEvent *)(xevent);
 
+      event->motion.device = &gdkdev->info;
+      
+      event->motion.axes = g_new (gdouble, gdkdev->info.num_axes);
       gdk_input_translate_coordinates(gdkdev,input_window,xdme->axis_data,
-                                     &event->motion.x,&event->motion.y,
-                                     &event->motion.pressure,
-                                     &event->motion.xtilt, 
-                                     &event->motion.ytilt);
+                                     event->motion.axes,
+                                     &event->motion.x,&event->motion.y);
 
       event->motion.type = GDK_MOTION_NOTIFY;
       event->motion.window = input_window->window;
       event->motion.time = xdme->time;
-      event->motion.deviceid = xdme->deviceid;
       event->motion.state = gdk_input_translate_state(xdme->state,
                                                      xdme->device_state);
       event->motion.is_hint = xdme->is_hint;
-      event->motion.source = gdkdev->info.source;
-      event->motion.deviceid = xdme->deviceid;
 
       GDK_NOTE (EVENTS,
        g_print ("motion notify:\t\twindow: %ld  device: %ld  x,y: %f %f  state %#4x  hint: %s\n",
@@ -707,12 +657,11 @@ gdk_input_common_other_event (GdkEvent         *event,
     {
       XProximityNotifyEvent *xpne = (XProximityNotifyEvent *)(xevent);
 
+      event->proximity.device = &gdkdev->info;
       event->proximity.type = (xevent->type == gdkdev->proximityin_type)?
        GDK_PROXIMITY_IN:GDK_PROXIMITY_OUT;
       event->proximity.window = input_window->window;
       event->proximity.time = xpne->time;
-      event->proximity.source = gdkdev->info.source;
-      event->proximity.deviceid = xpne->deviceid;
       
       return TRUE;
   }
@@ -720,128 +669,91 @@ gdk_input_common_other_event (GdkEvent         *event,
   return -1;                   /* wasn't one of our event types */
 }
 
-void
-gdk_input_common_set_axes (guint32 deviceid, GdkAxisUse *axes)
+gboolean
+_gdk_device_get_history (GdkDevice         *device,
+                        GdkWindow         *window,
+                        guint32            start,
+                        guint32            stop,
+                        GdkTimeCoord    ***events,
+                        gint              *n_events)
 {
-  int i;
-  GdkDevicePrivate *gdkdev = gdk_input_find_device(deviceid);
-  g_return_if_fail (gdkdev != NULL);
-
-  for (i=GDK_AXIS_IGNORE;i<GDK_AXIS_LAST;i++)
-    {
-      gdkdev->axis_for_use[i] = -1;
-    }
-
-  for (i=0;i<gdkdev->info.num_axes;i++)
-    {
-      gdkdev->info.axes[i] = axes[i];
-      gdkdev->axis_for_use[axes[i]] = i;
-    }
-}
-
-void 
-gdk_input_common_set_key (guint32 deviceid,
-                         guint   index,
-                         guint   keyval,
-                         GdkModifierType modifiers)
-{
-  GdkDevicePrivate *gdkdev = gdk_input_find_device(deviceid);
-  
-  gdkdev = gdk_input_find_device (deviceid);
-  g_return_if_fail (gdkdev != NULL);
-  g_return_if_fail (index < gdkdev->info.num_keys);
-
-  gdkdev->info.keys[index].keyval = keyval;
-  gdkdev->info.keys[index].modifiers = modifiers;
-}
-
-GdkTimeCoord *
-gdk_input_common_motion_events (GdkWindow *window,
-                               guint32 deviceid,
-                               guint32 start,
-                               guint32 stop,
-                               gint *nevents_return)
-{
-  GdkTimeCoord *coords;
+  GdkTimeCoord **coords;
   XDeviceTimeCoord *device_coords;
   GdkInputWindow *input_window;
   GdkDevicePrivate *gdkdev;
+  gint mode_return;
+  gint axis_count_return;
+  gint i;
 
-  int mode_return;
-  int axis_count_return;
-  int i;
-
-  gdkdev = gdk_input_find_device (deviceid);
+  gdkdev = (GdkDevicePrivate *)device;
   input_window = gdk_input_window_find (window);
 
-  g_return_val_if_fail (gdkdev != NULL, NULL);
-  g_return_val_if_fail (gdkdev->xdevice != NULL, NULL);
-  g_return_val_if_fail (input_window != NULL, NULL);
+  g_return_val_if_fail (input_window != NULL, FALSE);
 
   device_coords = XGetDeviceMotionEvents (gdk_display,
                                          gdkdev->xdevice,
                                          start, stop,
-                                         nevents_return, &mode_return,
+                                         n_events, &mode_return,
                                          &axis_count_return);
 
   if (device_coords)
     {
-      coords = g_new (GdkTimeCoord, *nevents_return);
+      coords = _gdk_device_allocate_history (device, *n_events);
       
-      for (i=0; i<*nevents_return; i++)
-       {
-         gdk_input_translate_coordinates (gdkdev, input_window,
-                                          device_coords[i].data,
-                                          &coords[i].x, &coords[i].y,
-                                          &coords[i].pressure,
-                                          &coords[i].xtilt, &coords[i].ytilt);
-       }
+      for (i=0; i<*n_events; i++)
+       gdk_input_translate_coordinates (gdkdev, input_window,
+                                        device_coords[i].data,
+                                        coords[i]->axes, NULL, NULL);
       XFreeDeviceMotionEvents (device_coords);
 
-      return coords;
+      *events = coords;
+
+      return TRUE;
     }
   else
-    return NULL;
+    {
+      *events = NULL;
+      *n_events = 0;
+
+      return FALSE;
+    }
 }
 
 void 
-gdk_input_common_get_pointer     (GdkWindow       *window,
-                                 guint32          deviceid,
-                                 gdouble         *x,
-                                 gdouble         *y,
-                                 gdouble         *pressure,
-                                 gdouble         *xtilt,
-                                 gdouble         *ytilt,
-                                 GdkModifierType *mask)
+gdk_device_get_state (GdkDevice       *device,
+                     GdkWindow       *window,
+                     gdouble         *axes,
+                     GdkModifierType *mask)
 {
-  GdkDevicePrivate *gdkdev;
-  GdkInputWindow *input_window;
-  XDeviceState *state;
-  XInputClass *input_class;
-  gint x_int, y_int;
   gint i;
 
-  /* we probably need to get the mask in any case */
+  g_return_if_fail (device != NULL);
+  g_return_if_fail (GDK_IS_WINDOW (window));
 
-  if (deviceid == GDK_CORE_POINTER)
+  if (GDK_IS_CORE (device))
     {
+      gint x_int, y_int;
+      
       gdk_window_get_pointer (window, &x_int, &y_int, mask);
-      if (x) *x = x_int;
-      if (y) *y = y_int;
-      if (pressure) *pressure = 0.5;
-      if (xtilt) *xtilt = 0;
-      if (ytilt) *ytilt = 0;
+
+      if (axes)
+       {
+         axes[0] = x_int;
+         axes[1] = y_int;
+       }
     }
   else
     {
+      GdkDevicePrivate *gdkdev;
+      GdkInputWindow *input_window;
+      XDeviceState *state;
+      XInputClass *input_class;
+      
       if (mask)
        gdk_window_get_pointer (window, NULL, NULL, mask);
       
-      gdkdev = gdk_input_find_device (deviceid);
+      gdkdev = (GdkDevicePrivate *)device;
       input_window = gdk_input_window_find (window);
-
-      g_return_if_fail (gdkdev != NULL);
-      g_return_if_fail (gdkdev->xdevice != NULL);
       g_return_if_fail (input_window != NULL);
 
       state = XQueryDeviceState (gdk_display, gdkdev->xdevice);
@@ -851,13 +763,12 @@ gdk_input_common_get_pointer     (GdkWindow       *window,
          switch (input_class->class)
            {
            case ValuatorClass:
-             gdk_input_translate_coordinates (gdkdev, input_window,
-                                              ((XValuatorState *)input_class)->valuators,
-                                              x, y, pressure,
-                                              xtilt, ytilt);
-                                                      
-                                                      
-               break;
+             if (axes)
+               gdk_input_translate_coordinates (gdkdev, input_window,
+                                                ((XValuatorState *)input_class)->valuators,
+                                                axes, NULL, NULL);
+             break;
+             
            case ButtonClass:
              if (mask)
                {
index 396151210ba4ffeb3a7c828c9d8fc541d2c8146f..c0b0fe9725e87497b545e535c2425973df44250b 100644 (file)
 
 /* forward declarations */
 
-static gint gdk_input_xfree_set_mode (guint32 deviceid, GdkInputMode mode);
 static void gdk_input_check_proximity (void);
-static void gdk_input_xfree_configure_event (XConfigureEvent *xevent, 
-                                            GdkWindow *window);
-static void gdk_input_xfree_enter_event (XCrossingEvent *xevent, 
-                                      GdkWindow *window);
-static gint gdk_input_xfree_other_event (GdkEvent *event, 
-                                        XEvent *xevent, 
-                                        GdkWindow *window);
-static gint gdk_input_xfree_enable_window(GdkWindow *window, 
-                                         GdkDevicePrivate *gdkdev);
-static gint gdk_input_xfree_disable_window(GdkWindow *window,
-                                          GdkDevicePrivate *gdkdev);
-static gint gdk_input_xfree_grab_pointer (GdkWindow *     window,
-                                         gint            owner_events,
-                                         GdkEventMask    event_mask,
-                                         GdkWindow *     confine_to,
-                                         guint32         time);
-static void gdk_input_xfree_ungrab_pointer (guint32 time);
 
 void 
 gdk_input_init(void)
 {
-  gdk_input_vtable.set_mode           = gdk_input_xfree_set_mode;
-  gdk_input_vtable.set_axes           = gdk_input_common_set_axes;
-  gdk_input_vtable.set_key            = gdk_input_common_set_key;
-  gdk_input_vtable.motion_events      = gdk_input_common_motion_events;
-  gdk_input_vtable.get_pointer       = gdk_input_common_get_pointer;
-  gdk_input_vtable.grab_pointer              = gdk_input_xfree_grab_pointer;
-  gdk_input_vtable.ungrab_pointer     = gdk_input_xfree_ungrab_pointer;
-  gdk_input_vtable.configure_event    = gdk_input_xfree_configure_event;
-  gdk_input_vtable.enter_event        = gdk_input_xfree_enter_event;
-  gdk_input_vtable.other_event        = gdk_input_xfree_other_event;
-  gdk_input_vtable.window_none_event  = NULL;
-  gdk_input_vtable.enable_window      = gdk_input_xfree_enable_window;
-  gdk_input_vtable.disable_window     = gdk_input_xfree_disable_window;
-
   gdk_input_ignore_core = FALSE;
   gdk_input_common_init(FALSE);
 }
 
-static gint
-gdk_input_xfree_set_mode (guint32 deviceid, GdkInputMode mode)
+gboolean
+gdk_device_set_mode (GdkDevice      *device,
+                    GdkInputMode    mode)
 {
   GList *tmp_list;
   GdkDevicePrivate *gdkdev;
   GdkInputMode old_mode;
   GdkInputWindow *input_window;
 
-  gdkdev = gdk_input_find_device(deviceid);
-  g_return_val_if_fail (gdkdev != NULL,FALSE);
-  old_mode = gdkdev->info.mode;
+  if (GDK_IS_CORE (device))
+    return FALSE;
+
+  gdkdev = (GdkDevicePrivate *)device;
 
-  if (gdkdev->info.mode == mode)
+  if (device->mode == mode)
     return TRUE;
 
-  gdkdev->info.mode = mode;
+  old_mode = device->mode;
+  device->mode = mode;
 
   if (mode == GDK_MODE_WINDOW)
     {
-      gdkdev->info.has_cursor = FALSE;
+      device->has_cursor = FALSE;
       for (tmp_list = gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
        {
          input_window = (GdkInputWindow *)tmp_list->data;
          if (input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
-           gdk_input_enable_window (input_window->window, gdkdev);
+           _gdk_input_enable_window (input_window->window, gdkdev);
          else
            if (old_mode != GDK_MODE_DISABLED)
-             gdk_input_disable_window (input_window->window, gdkdev);
+             _gdk_input_disable_window (input_window->window, gdkdev);
        }
     }
   else if (mode == GDK_MODE_SCREEN)
     {
-      gdkdev->info.has_cursor = TRUE;
+      device->has_cursor = TRUE;
       for (tmp_list = gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
-       gdk_input_enable_window (((GdkInputWindow *)tmp_list->data)->window,
-                                gdkdev);
+       _gdk_input_enable_window (((GdkInputWindow *)tmp_list->data)->window,
+                                 gdkdev);
     }
   else  /* mode == GDK_MODE_DISABLED */
     {
@@ -113,7 +84,7 @@ gdk_input_xfree_set_mode (guint32 deviceid, GdkInputMode mode)
          input_window = (GdkInputWindow *)tmp_list->data;
          if (old_mode != GDK_MODE_WINDOW ||
              input_window->mode != GDK_EXTENSION_EVENTS_CURSOR)
-           gdk_input_disable_window (input_window->window, gdkdev);
+           _gdk_input_disable_window (input_window->window, gdkdev);
        }
     }
 
@@ -132,7 +103,7 @@ gdk_input_check_proximity (void)
       GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)(tmp_list->data);
 
       if (gdkdev->info.mode != GDK_MODE_DISABLED 
-         && gdkdev->info.deviceid != GDK_CORE_POINTER
+         && !GDK_IS_CORE (gdkdev)
          && gdkdev->xdevice)
        {
          XDeviceState *state = XQueryDeviceState(GDK_DISPLAY(),
@@ -163,8 +134,9 @@ gdk_input_check_proximity (void)
   gdk_input_ignore_core = new_proximity;
 }
 
-static void
-gdk_input_xfree_configure_event (XConfigureEvent *xevent, GdkWindow *window)
+void
+_gdk_input_configure_event (XConfigureEvent *xevent,
+                           GdkWindow       *window)
 {
   GdkInputWindow *input_window;
   gint root_x, root_y;
@@ -180,9 +152,9 @@ gdk_input_xfree_configure_event (XConfigureEvent *xevent, GdkWindow *window)
   input_window->root_y = root_y;
 }
 
-static void 
-gdk_input_xfree_enter_event (XCrossingEvent *xevent, 
-                            GdkWindow      *window)
+void 
+_gdk_input_enter_event (XCrossingEvent *xevent, 
+                       GdkWindow      *window)
 {
   GdkInputWindow *input_window;
   gint root_x, root_y;
@@ -200,13 +172,13 @@ gdk_input_xfree_enter_event (XCrossingEvent *xevent,
   input_window->root_y = root_y;
 }
 
-static gint 
-gdk_input_xfree_other_event (GdkEvent *event, 
-                            XEvent *xevent, 
-                            GdkWindow *window)
+gint 
+_gdk_input_other_event (GdkEvent *event, 
+                       XEvent *xevent, 
+                       GdkWindow *window)
 {
   GdkInputWindow *input_window;
-
+  
   GdkDevicePrivate *gdkdev;
   gint return_val;
 
@@ -217,11 +189,10 @@ gdk_input_xfree_other_event (GdkEvent *event,
      but it's potentially faster than scanning through the types of
      every device. If we were deceived, then it won't match any of
      the types for the device anyways */
-  gdkdev = gdk_input_find_device(((XDeviceButtonEvent *)xevent)->deviceid);
+  gdkdev = gdk_input_find_device (((XDeviceButtonEvent *)xevent)->deviceid);
 
-  if (!gdkdev) {
+  if (!gdkdev)
     return -1;                 /* we don't handle it - not an XInput event */
-  }
 
   /* FIXME: It would be nice if we could just get rid of the events 
      entirely, instead of having to ignore them */
@@ -243,27 +214,27 @@ gdk_input_xfree_other_event (GdkEvent *event,
   return return_val;
 }
 
-static gint
-gdk_input_xfree_enable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
+gboolean
+_gdk_input_enable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
 {
   /* FIXME: watchout, gdkdev might be core pointer, never opened */
   gdk_input_common_select_events (window, gdkdev);
   return TRUE;
 }
 
-static gint
-gdk_input_xfree_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
+gboolean
+_gdk_input_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev)
 {
   gdk_input_common_select_events (window, gdkdev);
   return TRUE;
 }
 
-static gint 
-gdk_input_xfree_grab_pointer (GdkWindow *     window,
-                             gint            owner_events,
-                             GdkEventMask    event_mask,
-                             GdkWindow *     confine_to,
-                             guint32         time)
+gint 
+_gdk_input_grab_pointer (GdkWindow *     window,
+                        gint            owner_events,
+                        GdkEventMask    event_mask,
+                        GdkWindow *     confine_to,
+                        guint32         time)
 {
   GdkInputWindow *input_window, *new_window;
   gboolean need_ungrab;
@@ -300,8 +271,7 @@ gdk_input_xfree_grab_pointer (GdkWindow *     window,
       while (tmp_list)
        {
          gdkdev = (GdkDevicePrivate *)tmp_list->data;
-         if (gdkdev->info.deviceid != GDK_CORE_POINTER &&
-             gdkdev->xdevice)
+         if (!GDK_IS_CORE (gdkdev) && gdkdev->xdevice)
            {
              gdk_input_common_find_events (window, gdkdev,
                                            event_mask,
@@ -326,7 +296,7 @@ gdk_input_xfree_grab_pointer (GdkWindow *     window,
       while (tmp_list)
        {
          gdkdev = (GdkDevicePrivate *)tmp_list->data;
-         if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice &&
+         if (!GDK_IS_CORE (gdkdev) && gdkdev->xdevice &&
              ((gdkdev->button_state != 0) || need_ungrab))
            {
              XUngrabDevice( gdk_display, gdkdev->xdevice, time);
@@ -341,8 +311,8 @@ gdk_input_xfree_grab_pointer (GdkWindow *     window,
       
 }
 
-static void 
-gdk_input_xfree_ungrab_pointer (guint32 time)
+void 
+_gdk_input_ungrab_pointer (guint32 time)
 {
   GdkInputWindow *input_window;
   GdkDevicePrivate *gdkdev;
@@ -365,10 +335,17 @@ gdk_input_xfree_ungrab_pointer (guint32 time)
       while (tmp_list)
        {
          gdkdev = (GdkDevicePrivate *)tmp_list->data;
-         if (gdkdev->info.deviceid != GDK_CORE_POINTER && gdkdev->xdevice)
+         if (!GDK_IS_CORE (gdkdev) && gdkdev->xdevice)
            XUngrabDevice( gdk_display, gdkdev->xdevice, time);
 
          tmp_list = tmp_list->next;
        }
     }
 }
+
+gint 
+_gdk_input_window_none_event (GdkEvent         *event,
+                            XEvent           *xevent)
+{
+  return -1;
+}
index 4ee51b3154c3b3b84cd69ae9ce49b7c55a1acc4d..d87cf05f7161892b4b693ea1b9ff218f1bffe867 100644 (file)
 #include "gdkprivate.h"
 #include "gdkinputprivate.h"
 
-static const GdkAxisUse gdk_input_core_axes[] = { GDK_AXIS_X, GDK_AXIS_Y };
+static GdkDeviceAxis gdk_input_core_axes[] = {
+  { GDK_AXIS_X, 0, 0 },
+  { GDK_AXIS_Y, 0, 0 }
+};
 
-const GdkDeviceInfo gdk_input_core_info =
+static const GdkDevice gdk_input_core_info =
 {
-  GDK_CORE_POINTER,
   "Core Pointer",
   GDK_SOURCE_MOUSE,
   GDK_MODE_SCREEN,
   TRUE,
+  
   2,
-  gdk_input_core_axes
+  gdk_input_core_axes,
+
+  0,
+  NULL
 };
 
+GdkDevice *gdk_core_pointer = (GdkDevice *)&gdk_input_core_info;
 /* Global variables  */
 
-GdkInputVTable    gdk_input_vtable;
 /* information about network port and host for gxid daemon */
 gchar            *gdk_input_gxid_host;
 gint              gdk_input_gxid_port;
@@ -59,124 +66,138 @@ GList            *gdk_input_devices;
 GList            *gdk_input_windows;
 
 GList *
-gdk_input_list_devices (void)
+gdk_devices_list (void)
 {
   return gdk_input_devices;
 }
 
 void
-gdk_input_set_source (guint32 deviceid, GdkInputSource source)
+gdk_device_set_source (GdkDevice      *device,
+                      GdkInputSource  source)
 {
-  GdkDevicePrivate *gdkdev = gdk_input_find_device(deviceid);
-  g_return_if_fail (gdkdev != NULL);
+  g_return_if_fail (device != NULL);
 
-  gdkdev->info.source = source;
+  device->source = source;
 }
 
-gboolean
-gdk_input_set_mode (guint32 deviceid, GdkInputMode mode)
+void
+gdk_device_set_key (GdkDevice      *device,
+                   guint           index,
+                   guint           keyval,
+                   GdkModifierType modifiers)
 {
-  if (deviceid == GDK_CORE_POINTER)
-    return FALSE;
+  g_return_if_fail (device != NULL);
+  g_return_if_fail (index < device->num_keys);
 
-  if (gdk_input_vtable.set_mode)
-    return gdk_input_vtable.set_mode(deviceid,mode);
-  else
-    return FALSE;
+  device->keys[index].keyval = keyval;
+  device->keys[index].modifiers = modifiers;
 }
 
 void
-gdk_input_set_axes (guint32 deviceid, GdkAxisUse *axes)
+gdk_device_set_axis_use (GdkDevice   *device,
+                        guint        index,
+                        GdkAxisUse   use)
 {
-  if (deviceid != GDK_CORE_POINTER && gdk_input_vtable.set_axes)
-    gdk_input_vtable.set_axes (deviceid, axes);
-}
+  g_return_if_fail (device != NULL);
+  g_return_if_fail (index < device->num_axes);
 
-void gdk_input_set_key (guint32 deviceid,
-                       guint   index,
-                       guint   keyval,
-                       GdkModifierType modifiers)
-{
-  if (deviceid != GDK_CORE_POINTER && gdk_input_vtable.set_key)
-    gdk_input_vtable.set_key (deviceid, index, keyval, modifiers);
+  device->axes[index].use = use;
+
+  switch (use)
+    {
+    case GDK_AXIS_X:
+    case GDK_AXIS_Y:
+      device->axes[index].min = 0.;
+      device->axes[index].max = 0.;
+      break;
+    case GDK_AXIS_XTILT:
+    case GDK_AXIS_YTILT:
+      device->axes[index].min = -1.;
+      device->axes[index].max = 1;
+      break;
+    default:
+      device->axes[index].min = 0.;
+      device->axes[index].max = 1;
+      break;
+    }
 }
 
-GdkTimeCoord *
-gdk_input_motion_events (GdkWindow *window,
-                        guint32 deviceid,
-                        guint32 start,
-                        guint32 stop,
-                        gint *nevents_return)
+gboolean
+gdk_device_get_history  (GdkDevice         *device,
+                        GdkWindow         *window,
+                        guint32            start,
+                        guint32            stop,
+                        GdkTimeCoord    ***events,
+                        gint              *n_events)
 {
-  XTimeCoord *xcoords;
-  GdkTimeCoord *coords;
+  GdkTimeCoord **coords;
   int i;
 
-  g_return_val_if_fail (window != NULL, NULL);
-  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
-  
-  if (GDK_WINDOW_DESTROYED (window))
-    return NULL;
+  g_return_val_if_fail (window != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
+  g_return_val_if_fail (events != NULL, FALSE);
+  g_return_val_if_fail (n_events != NULL, FALSE);
+
+  *n_events = 0;
+  *events = NULL;
 
-  if (deviceid == GDK_CORE_POINTER)
+  if (GDK_WINDOW_DESTROYED (window))
+    return FALSE;
+    
+  if (GDK_IS_CORE (device))
     {
+      XTimeCoord *xcoords;
+      
       xcoords = XGetMotionEvents (GDK_DRAWABLE_XDISPLAY (window),
                                  GDK_DRAWABLE_XID (window),
-                                 start, stop, nevents_return);
+                                 start, stop, n_events);
       if (xcoords)
        {
-         coords = g_new (GdkTimeCoord, *nevents_return);
-         for (i=0; i<*nevents_return; i++)
+         coords = _gdk_device_allocate_history (device, *n_events);
+         for (i=0; i<*n_events; i++)
            {
-             coords[i].time = xcoords[i].time;
-             coords[i].x = xcoords[i].x;
-             coords[i].y = xcoords[i].y;
-             coords[i].pressure = 0.5;
-             coords[i].xtilt = 0.0;
-             coords[i].ytilt = 0.0;
+             coords[i]->time = xcoords[i].time;
+             coords[i]->axes[0] = xcoords[i].x;
+             coords[i]->axes[1] = xcoords[i].y;
            }
 
          XFree (xcoords);
 
-         return coords;
+         *events = coords;
+         return TRUE;
        }
       else
-       return NULL;
+       return FALSE;
     }
   else
-    {
-      if (gdk_input_vtable.motion_events)
-       {
-         return gdk_input_vtable.motion_events(window,
-                                               deviceid, start, stop,
-                                               nevents_return);
-       }
-      else
-       {
-         *nevents_return = 0;
-         return NULL;
-       }
-    }
+    return _gdk_device_get_history (device, window, start, stop, events, n_events);
 }
 
-gint
-gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
+GdkTimeCoord ** 
+_gdk_device_allocate_history (GdkDevice *device,
+                             gint       n_events)
 {
-  if (gdk_input_vtable.enable_window)
-    return gdk_input_vtable.enable_window (window, gdkdev);
-  else
-    return TRUE;
+  GdkTimeCoord **result = g_new (GdkTimeCoord *, n_events);
+  gint i;
+
+  for (i=0; i<n_events; i++)
+    result[i] = g_malloc (sizeof (GdkTimeCoord) -
+                         sizeof (double) * (GDK_MAX_TIMECOORD_AXES - device->num_axes));
+
+  return result;
 }
 
-gint
-gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev)
+void 
+gdk_device_free_history (GdkTimeCoord **events,
+                        gint           n_events)
 {
-  if (gdk_input_vtable.disable_window)
-    return gdk_input_vtable.disable_window(window,gdkdev);
-  else
-    return TRUE;
-}
+  gint i;
+  
+  for (i=0; i<n_events; i++)
+    g_free (events[i]);
 
+  g_free (events);
+}
 
 GdkInputWindow *
 gdk_input_window_find(GdkWindow *window)
@@ -248,15 +269,15 @@ gdk_input_set_extension_events (GdkWindow *window, gint mask,
 
   for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
     {
-      GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)(tmp_list->data);
+      GdkDevicePrivate *gdkdev = tmp_list->data;
 
-      if (gdkdev->info.deviceid != GDK_CORE_POINTER)
+      if (!GDK_IS_CORE (gdkdev))
        {
          if (mask != 0 && gdkdev->info.mode != GDK_MODE_DISABLED
              && (gdkdev->info.has_cursor || mode == GDK_EXTENSION_EVENTS_ALL))
-           gdk_input_enable_window(window,gdkdev);
+           _gdk_input_enable_window (window,gdkdev);
          else
-           gdk_input_disable_window(window,gdkdev);
+           _gdk_input_disable_window (window,gdkdev);
        }
     }
 }
@@ -282,9 +303,9 @@ gdk_input_exit (void)
   for (tmp_list = gdk_input_devices; tmp_list; tmp_list = tmp_list->next)
     {
       gdkdev = (GdkDevicePrivate *)(tmp_list->data);
-      if (gdkdev->info.deviceid != GDK_CORE_POINTER)
+      if (!GDK_IS_CORE (gdkdev))
        {
-         gdk_input_set_mode(gdkdev->info.deviceid,GDK_MODE_DISABLED);
+         gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED);
 
          g_free(gdkdev->info.name);
 #ifndef XINPUT_NONE      
@@ -299,38 +320,40 @@ gdk_input_exit (void)
   g_list_free(gdk_input_devices);
 
   for (tmp_list = gdk_input_windows; tmp_list; tmp_list = tmp_list->next)
-    {
-      g_free(tmp_list->data);
-    }
+    g_free(tmp_list->data);
+
   g_list_free(gdk_input_windows);
 }
 
-GdkDevicePrivate *
-gdk_input_find_device(guint32 id)
+/**
+ * gdk_device_get_axis:
+ * @axis: a #GdkDevice
+ * @axes: pointer to an array of axes
+ * @use: the use to look for
+ * @value: location to store the found value.
+ * 
+ * Interprets an array of double as axis values for a given device,
+ * and locates the value in the array for a given axis use.
+ * 
+ * Return value: %TRUE if the given axis use was found, otherwies %FALSE
+ **/
+gboolean
+gdk_device_get_axis (GdkDevice *device, gdouble *axes, GdkAxisUse use, gdouble *value)
 {
-  GList *tmp_list = gdk_input_devices;
-  GdkDevicePrivate *gdkdev;
-  while (tmp_list)
-    {
-      gdkdev = (GdkDevicePrivate *)(tmp_list->data);
-      if (gdkdev->info.deviceid == id)
-       return gdkdev;
-      tmp_list = tmp_list->next;
-    }
-  return NULL;
-}
+  gint i;
+  
+  g_return_val_if_fail (device != NULL, FALSE);
 
-void
-gdk_input_window_get_pointer (GdkWindow       *window,
-                             guint32     deviceid,
-                             gdouble         *x,
-                             gdouble         *y,
-                             gdouble         *pressure,
-                             gdouble         *xtilt,
-                             gdouble         *ytilt,
-                             GdkModifierType *mask)
-{
-  if (gdk_input_vtable.get_pointer)
-    gdk_input_vtable.get_pointer (window, deviceid, x, y, pressure,
-                                 xtilt, ytilt, mask);
+  if (axes == NULL)
+    return FALSE;
+  
+  for (i=0; i<device->num_axes; i++)
+    if (device->axes[i].use == use)
+      {
+       if (value)
+         *value = axes[i];
+       return TRUE;
+      }
+  
+  return FALSE;
 }
index 552bd1b034e268fb8bd9ca678c70208184fa643d..be680d0dfcfd33c42428b6e9dfa3586a871e0e4c 100644 (file)
 #endif
 
 typedef struct _GdkAxisInfo    GdkAxisInfo;
-typedef struct _GdkInputVTable GdkInputVTable;
 typedef struct _GdkDevicePrivate GdkDevicePrivate;
 typedef struct _GdkInputWindow GdkInputWindow;
 
-struct _GdkInputVTable {
-  gint (*set_mode) (guint32 deviceid, GdkInputMode mode);
-  void (*set_axes) (guint32 deviceid, GdkAxisUse *axes);
-  void (*set_key)  (guint32 deviceid,
-                   guint   index,
-                   guint   keyval,
-                   GdkModifierType modifiers);
-       
-  GdkTimeCoord* (*motion_events) (GdkWindow *window,
-                                 guint32 deviceid,
-                                 guint32 start,
-                                 guint32 stop,
-                                 gint *nevents_return);
-  void (*get_pointer)   (GdkWindow       *window,
-                        guint32          deviceid,
-                        gdouble         *x,
-                        gdouble         *y,
-                        gdouble         *pressure,
-                        gdouble         *xtilt,
-                        gdouble         *ytilt,
-                        GdkModifierType *mask);
-  gint (*grab_pointer) (GdkWindow *     window,
-                       gint            owner_events,
-                       GdkEventMask    event_mask,
-                       GdkWindow *     confine_to,
-                       guint32         time);
-  void (*ungrab_pointer) (guint32 time);
-
-  void (*configure_event) (XConfigureEvent *xevent, GdkWindow *window);
-  void (*enter_event) (XCrossingEvent *xevent, GdkWindow *window);
-  gint (*other_event) (GdkEvent *event, XEvent *xevent, GdkWindow *window);
-  /* Handle an unidentified event. Returns TRUE if handled, FALSE
-     otherwise */
-  gint (*window_none_event) (GdkEvent *event, XEvent *xevent);
-  gint (*enable_window) (GdkWindow *window, GdkDevicePrivate *gdkdev);
-  gint (*disable_window) (GdkWindow *window, GdkDevicePrivate *gdkdev);
-};
-
 /* information about a device axis */
 struct _GdkAxisInfo
 {
@@ -100,16 +61,17 @@ struct _GdkAxisInfo
 
 #define GDK_INPUT_NUM_EVENTC 6
 
-struct _GdkDevicePrivate {
-  GdkDeviceInfo  info;
+struct _GdkDevicePrivate
+{
+  GdkDevice info;
+
+  guint32 deviceid;
+  
 
 #ifndef XINPUT_NONE
   /* information about the axes */
   GdkAxisInfo *axes;
 
-  /* reverse lookup on axis use type */
-  gint axis_for_use[GDK_AXIS_LAST];
-  
   /* Information about XInput device */
   XDevice       *xdevice;
 
@@ -154,11 +116,11 @@ struct _GdkInputWindow
 
 /* Global data */
 
-extern const GdkDeviceInfo gdk_input_core_info;
+#define GDK_IS_CORE(d) (((GdkDevice *)(d)) == gdk_core_pointer)
+
 extern GList *gdk_input_devices;
 extern GList *gdk_input_windows;
 
-extern GdkInputVTable gdk_input_vtable;
 /* information about network port and host for gxid daemon */
 extern gchar           *gdk_input_gxid_host;
 extern gint             gdk_input_gxid_port;
@@ -166,63 +128,64 @@ extern gint             gdk_input_ignore_core;
 
 /* Function declarations */
 
-GdkDevicePrivate * gdk_input_find_device    (guint32           id);
-GdkInputWindow *   gdk_input_window_find    (GdkWindow        *window);
-void               gdk_input_window_destroy (GdkWindow        *window);
-void               gdk_input_init           (void);
-void               gdk_input_exit           (void);
-gint               gdk_input_enable_window  (GdkWindow        *window,
-                                            GdkDevicePrivate *gdkdev);
-gint               gdk_input_disable_window (GdkWindow        *window,
-                                            GdkDevicePrivate *gdkdev);
+GdkInputWindow *gdk_input_window_find        (GdkWindow *window);
+void            gdk_input_window_destroy     (GdkWindow *window);
+GdkTimeCoord ** _gdk_device_allocate_history (GdkDevice *device,
+                                             gint       n_events);
+
+/* The following functions are provided by each implementation
+ * (xfree, gxi, and none)
+ */
+gint             _gdk_input_enable_window     (GdkWindow        *window,
+                                             GdkDevicePrivate *gdkdev);
+gint             _gdk_input_disable_window    (GdkWindow        *window,
+                                             GdkDevicePrivate *gdkdev);
+gint             _gdk_input_window_none_event (GdkEvent         *event,
+                                             XEvent           *xevent);
+void             _gdk_input_configure_event  (XConfigureEvent  *xevent,
+                                             GdkWindow        *window);
+void             _gdk_input_enter_event      (XCrossingEvent   *xevent,
+                                             GdkWindow        *window);
+gint             _gdk_input_other_event      (GdkEvent         *event,
+                                             XEvent           *xevent,
+                                             GdkWindow        *window);
+gint             _gdk_input_grab_pointer     (GdkWindow        *window,
+                                             gint              owner_events,
+                                             GdkEventMask      event_mask,
+                                             GdkWindow        *confine_to,
+                                             guint32           time);
+void             _gdk_input_ungrab_pointer   (guint32           time);
+gboolean         _gdk_device_get_history     (GdkDevice         *device,
+                                             GdkWindow         *window,
+                                             guint32            start,
+                                             guint32            stop,
+                                             GdkTimeCoord    ***events,
+                                             gint              *n_events);
 
 #ifndef XINPUT_NONE
 
 #define GDK_MAX_DEVICE_CLASSES 13
 
-gint           gdk_input_common_init                (gint              include_core);
-void           gdk_input_get_root_relative_geometry (Display          *dpy,
-                                                    Window            w,
-                                                    int              *x_ret,
-                                                    int              *y_ret,
-                                                    int              *width_ret,
-                                                    int              *height_ret);
-void           gdk_input_common_find_events         (GdkWindow        *window,
-                                                    GdkDevicePrivate *gdkdev,
-                                                    gint              mask,
-                                                    XEventClass      *classes,
-                                                    int              *num_classes);
-void           gdk_input_common_select_events       (GdkWindow        *window,
-                                                    GdkDevicePrivate *gdkdev);
-gint           gdk_input_common_other_event         (GdkEvent         *event,
-                                                    XEvent           *xevent,
-                                                    GdkInputWindow   *input_window,
-                                                    GdkDevicePrivate *gdkdev);
-void           gdk_input_common_get_pointer         (GdkWindow        *window,
-                                                    guint32           deviceid,
-                                                    gdouble          *x,
-                                                    gdouble          *y,
-                                                    gdouble          *pressure,
-                                                    gdouble          *xtilt,
-                                                    gdouble          *ytilt,
-                                                    GdkModifierType  *mask);
-void           gdk_input_common_set_key             (guint32           deviceid,
-                                                    guint             index,
-                                                    guint             keyval,
-                                                    GdkModifierType   modifiers);
-void           gdk_input_common_set_axes            (guint32           deviceid,
-                                                    GdkAxisUse       *axes);
-GdkTimeCoord * gdk_input_common_motion_events       (GdkWindow        *window,
-                                                    guint32           deviceid,
-                                                    guint32           start,
-                                                    guint32           stop,
-                                                    gint             *nevents_return);
+gint               gdk_input_common_init                (gint              include_core);
+GdkDevicePrivate * gdk_input_find_device                (guint32           id);
+void               gdk_input_get_root_relative_geometry (Display          *dpy,
+                                                        Window            w,
+                                                        int              *x_ret,
+                                                        int              *y_ret,
+                                                        int              *width_ret,
+                                                        int              *height_ret);
+void               gdk_input_common_find_events         (GdkWindow        *window,
+                                                        GdkDevicePrivate *gdkdev,
+                                                        gint              mask,
+                                                        XEventClass      *classes,
+                                                        int              *num_classes);
+void               gdk_input_common_select_events       (GdkWindow        *window,
+                                                        GdkDevicePrivate *gdkdev);
+gint               gdk_input_common_other_event         (GdkEvent         *event,
+                                                        XEvent           *xevent,
+                                                        GdkInputWindow   *input_window,
+                                                        GdkDevicePrivate *gdkdev);
 
 #endif /* !XINPUT_NONE */
 
-GdkDevicePrivate *gdk_input_find_device (guint32 id);
-GdkInputWindow *gdk_input_window_find (GdkWindow *window);
-void gdk_input_window_destroy (GdkWindow *window);
-void gdk_input_exit           (void);
-
 #endif /* __GDK_INPUTPRIVATE_H__ */
index b266a67e22cb6f587894c3d509296a98325ae2c3..7b48264b60f595ab17a4594724d5ff94a059c8de 100644 (file)
@@ -267,15 +267,12 @@ gdk_pointer_grab (GdkWindow *       window,
        xevent_mask |= gdk_event_mask_table[i];
     }
   
-  if (gdk_input_vtable.grab_pointer)
-    return_val = gdk_input_vtable.grab_pointer (window,
-                                               owner_events,
-                                               event_mask,
-                                               confine_to,
-                                               time);
-  else
-    return_val = Success;
-  
+  return_val = _gdk_input_grab_pointer (window,
+                                       owner_events,
+                                       event_mask,
+                                       confine_to,
+                                       time);
+
   if (return_val == Success)
     {
       if (!GDK_WINDOW_DESTROYED (window))
@@ -315,8 +312,7 @@ gdk_pointer_grab (GdkWindow *         window,
 void
 gdk_pointer_ungrab (guint32 time)
 {
-  if (gdk_input_vtable.ungrab_pointer)
-    gdk_input_vtable.ungrab_pointer (time);
+  _gdk_input_ungrab_pointer (time);
   
   XUngrabPointer (gdk_display, time);
   gdk_xgrab_window = NULL;
index 5f21feff8fc258150c141e4de4bc9369d9b56f88..d3e0925205c50ceddbbe9dd02655cfe8c3d4712d 100644 (file)
@@ -2716,13 +2716,10 @@ gtk_drag_end (GtkDragSourceInfo *info, guint32 time)
   send_event.button.time = time;
   send_event.button.x = 0;
   send_event.button.y = 0;
-  send_event.button.pressure = 0.;
-  send_event.button.xtilt = 0.;
-  send_event.button.ytilt = 0.;
+  send_event.button.axes = NULL;
   send_event.button.state = 0;
   send_event.button.button = info->button;
-  send_event.button.source = GDK_SOURCE_PEN;
-  send_event.button.deviceid = GDK_CORE_POINTER;
+  send_event.button.device = gdk_core_pointer;
   send_event.button.x_root = 0;
   send_event.button.y_root = 0;
 
index aca11705589c445c8e0a6213a9e780219d4981e4..6e6836295f07e5e54f4aa2aa992c56eb0acc1a2f 100644 (file)
@@ -77,45 +77,32 @@ enum
 
 /* Forward declarations */
 
-static void gtk_input_dialog_class_init (GtkInputDialogClass *klass);
-static void gtk_input_dialog_init (GtkInputDialog *inputd);
-static GdkDeviceInfo *gtk_input_dialog_get_device_info(guint32 deviceid);
-static void gtk_input_dialog_set_device(GtkWidget *widget, gpointer data);
-static void gtk_input_dialog_set_mapping_mode(GtkWidget *w,
-                                             gpointer data);
-static void gtk_input_dialog_set_axis(GtkWidget *widget, gpointer data);
-static void gtk_input_dialog_fill_axes (GtkInputDialog *inputd,
-                                       GdkDeviceInfo *info);
-static void gtk_input_dialog_set_key (GtkInputKeyInfo *key,
-                                     guint keyval, 
-                                     GdkModifierType modifiers);
-static gint gtk_input_dialog_key_press (GtkWidget *widget, 
-                                       GdkEventKey *event,
-                                       GtkInputKeyInfo *key);
-static void gtk_input_dialog_clear_key (GtkWidget *widget, 
-                                       GtkInputKeyInfo *key);
-static void gtk_input_dialog_destroy_key (GtkWidget *widget, 
-                                         GtkInputKeyInfo *key);
-static void gtk_input_dialog_fill_keys (GtkInputDialog *inputd,
-                                       GdkDeviceInfo *info);
+static void gtk_input_dialog_class_init       (GtkInputDialogClass *klass);
+static void gtk_input_dialog_init             (GtkInputDialog      *inputd);
+static void gtk_input_dialog_set_device       (GtkWidget           *widget,
+                                              gpointer             data);
+static void gtk_input_dialog_set_mapping_mode (GtkWidget           *w,
+                                              gpointer             data);
+static void gtk_input_dialog_set_axis         (GtkWidget           *widget,
+                                              gpointer             data);
+static void gtk_input_dialog_fill_axes        (GtkInputDialog      *inputd,
+                                              GdkDevice           *info);
+static void gtk_input_dialog_set_key          (GtkInputKeyInfo     *key,
+                                              guint                keyval,
+                                              GdkModifierType      modifiers);
+static gint gtk_input_dialog_key_press        (GtkWidget           *widget,
+                                              GdkEventKey         *event,
+                                              GtkInputKeyInfo     *key);
+static void gtk_input_dialog_clear_key        (GtkWidget           *widget,
+                                              GtkInputKeyInfo     *key);
+static void gtk_input_dialog_destroy_key      (GtkWidget           *widget,
+                                              GtkInputKeyInfo     *key);
+static void gtk_input_dialog_fill_keys        (GtkInputDialog      *inputd,
+                                              GdkDevice           *info);
 
 static GtkObjectClass *parent_class = NULL;
 static guint input_dialog_signals[LAST_SIGNAL] = { 0 };
 
-static GdkDeviceInfo *
-gtk_input_dialog_get_device_info(guint32 deviceid)
-{
-  GList *tmp_list = gdk_input_list_devices();
-  while (tmp_list)
-    {
-      if (((GdkDeviceInfo *)tmp_list->data)->deviceid == deviceid)
-       return (GdkDeviceInfo *)tmp_list->data;
-      tmp_list = tmp_list->next;
-    }
-
-  return NULL;
-}
-
 GtkType
 gtk_input_dialog_get_type (void)
 {
@@ -156,16 +143,16 @@ gtk_input_dialog_class_init (GtkInputDialogClass *klass)
                    GTK_RUN_LAST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkInputDialogClass, enable_device),
-                   gtk_marshal_NONE__INT,
-                   GTK_TYPE_NONE, 1, GTK_TYPE_INT);
+                   gtk_marshal_NONE__POINTER,
+                   GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
 
   input_dialog_signals[DISABLE_DEVICE] =
     gtk_signal_new ("disable_device",
                    GTK_RUN_LAST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkInputDialogClass, disable_device),
-                   gtk_marshal_NONE__INT,
-                   GTK_TYPE_NONE, 1, GTK_TYPE_INT);
+                   gtk_marshal_NONE__POINTER,
+                   GTK_TYPE_NONE, 1, GTK_TYPE_POINTER);
 
   gtk_object_class_add_signals (object_class, input_dialog_signals,
                                LAST_SIGNAL);
@@ -191,7 +178,7 @@ gtk_input_dialog_init (GtkInputDialog *inputd)
   GList *tmp_list;
   GList *device_info;
 
-  device_info = gdk_input_list_devices();
+  device_info = gdk_devices_list ();
 
   /* shell and main vbox */
 
@@ -215,8 +202,8 @@ gtk_input_dialog_init (GtkInputDialog *inputd)
       device_menu = gtk_menu_new ();
 
       for (tmp_list = device_info; tmp_list; tmp_list = tmp_list->next) {
-       GdkDeviceInfo *info = (GdkDeviceInfo *)(tmp_list->data);
-       if (info->deviceid != GDK_CORE_POINTER)
+       GdkDevice *info = (GdkDevice *)(tmp_list->data);
+       if (info != gdk_core_pointer)
          {
            menuitem = gtk_menu_item_new_with_label(info->name);
 
@@ -225,7 +212,7 @@ gtk_input_dialog_init (GtkInputDialog *inputd)
            gtk_object_set_user_data (GTK_OBJECT (menuitem), inputd);
            gtk_signal_connect (GTK_OBJECT (menuitem), "activate",
                                (GtkSignalFunc) gtk_input_dialog_set_device,
-                               GUINT_TO_POINTER(info->deviceid));
+                               info);
          }
       }
 
@@ -333,8 +320,7 @@ gtk_input_dialog_init (GtkInputDialog *inputd)
 
       /* ...set_device expects to get input dialog from widget user data */
       gtk_object_set_user_data (GTK_OBJECT (inputd), inputd);
-      gtk_input_dialog_set_device(GTK_WIDGET(inputd), 
-          GUINT_TO_POINTER (((GdkDeviceInfo *)device_info->data)->deviceid));
+      gtk_input_dialog_set_device (GTK_WIDGET(inputd), device_info->data);
 
     }
 
@@ -374,44 +360,42 @@ gtk_input_dialog_new (void)
 static void
 gtk_input_dialog_set_device(GtkWidget *widget, gpointer data)
 {
-  guint32 deviceid = GPOINTER_TO_UINT(data);
-  GdkDeviceInfo *info;
+  GdkDevice *device = data;
 
   GtkInputDialog *inputd = GTK_INPUT_DIALOG(
                 gtk_object_get_user_data(GTK_OBJECT(widget)));
 
-  inputd->current_device = deviceid;
-  info = gtk_input_dialog_get_device_info (deviceid);
+  inputd->current_device = device;
 
-  gtk_input_dialog_fill_axes(inputd, info);
-  gtk_input_dialog_fill_keys(inputd, info);
+  gtk_input_dialog_fill_axes(inputd, device);
+  gtk_input_dialog_fill_keys(inputd, device);
 
   gtk_option_menu_set_history(GTK_OPTION_MENU(inputd->mode_optionmenu),
-                             info->mode);
+                             device->mode);
 }
 
 static void
-gtk_input_dialog_set_mapping_mode(GtkWidget *w,
-                                 gpointer data)
+gtk_input_dialog_set_mapping_mode (GtkWidget *w,
+                                  gpointer   data)
 {
   GtkInputDialog *inputd = GTK_INPUT_DIALOG(
                 gtk_object_get_user_data(GTK_OBJECT(w)));
-  GdkDeviceInfo *info = gtk_input_dialog_get_device_info (inputd->current_device);
+  GdkDevice *info = inputd->current_device;
   GdkInputMode old_mode = info->mode;
   GdkInputMode mode = GPOINTER_TO_INT (data);
 
   if (mode != old_mode)
     {
-      if (gdk_input_set_mode(inputd->current_device, mode))
+      if (gdk_device_set_mode (inputd->current_device, mode))
        {
          if (mode == GDK_MODE_DISABLED)
            gtk_signal_emit (GTK_OBJECT (inputd),
                             input_dialog_signals[DISABLE_DEVICE],
-                            info->deviceid);
+                            info);
          else
            gtk_signal_emit (GTK_OBJECT (inputd),
                             input_dialog_signals[ENABLE_DEVICE],
-                            info->deviceid);
+                            info);
        }
       else
        gtk_option_menu_set_history (GTK_OPTION_MENU (inputd->mode_optionmenu),
@@ -428,7 +412,7 @@ gtk_input_dialog_set_axis(GtkWidget *widget, gpointer data)
   GdkAxisUse old_use;
   GdkAxisUse *new_axes;
   GtkInputDialog *inputd = GTK_INPUT_DIALOG (gtk_object_get_user_data (GTK_OBJECT (widget)));
-  GdkDeviceInfo *info = gtk_input_dialog_get_device_info (inputd->current_device);
+  GdkDevice *info = inputd->current_device;
 
   gint axis = (GPOINTER_TO_INT(data) >> 16) - 1;
   gint old_axis;
@@ -438,13 +422,13 @@ gtk_input_dialog_set_axis(GtkWidget *widget, gpointer data)
   old_axis = -1;
   for (i=0;i<info->num_axes;i++)
     {
-      new_axes[i] = info->axes[i];
-      if (info->axes[i] == use)
+      new_axes[i] = info->axes[i].use;
+      if (info->axes[i].use == use)
        old_axis = i;
     }
 
   if (axis != -1)
-    old_use = info->axes[axis];
+    old_use = info->axes[axis].use;
   else
     old_use = GDK_AXIS_IGNORE;
 
@@ -462,10 +446,10 @@ gtk_input_dialog_set_axis(GtkWidget *widget, gpointer data)
   else
     {
       if (axis != -1)
-       new_axes[axis] = use;
+       gdk_device_set_axis_use (info, axis, use);
 
       if (old_axis != -1)
-       new_axes[old_axis] = old_use;
+       gdk_device_set_axis_use (info, old_axis, old_use);
 
       if (old_use != GDK_AXIS_IGNORE)
        {
@@ -473,14 +457,13 @@ gtk_input_dialog_set_axis(GtkWidget *widget, gpointer data)
                GTK_OPTION_MENU (inputd->axis_items[old_use]),
                old_axis + 1);
        }
-      gdk_input_set_axes (info->deviceid, new_axes);
     }
 
   g_free (new_axes);
 }
 
 static void
-gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDeviceInfo *info)
+gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDevice *info)
 {
   static const char *axis_use_strings[GDK_AXIS_LAST] =
   {
@@ -489,7 +472,8 @@ gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDeviceInfo *info)
     N_("Y"),
     N_("Pressure"),
     N_("X Tilt"),
-    N_("Y Tilt")
+    N_("Y Tilt"),
+    N_("Wheel")
   };
 
   int i,j;
@@ -550,7 +534,7 @@ gtk_input_dialog_fill_axes(GtkInputDialog *inputd, GdkDeviceInfo *info)
       gtk_widget_show (option_menu);
       gtk_option_menu_set_menu (GTK_OPTION_MENU (option_menu), menu);
       for (j = 0; j < info->num_axes; j++)
-       if (info->axes[j] == (GdkAxisUse) i)
+       if (info->axes[j].use == (GdkAxisUse) i)
          {
            gtk_option_menu_set_history (GTK_OPTION_MENU (option_menu), j+1);
            break;
@@ -564,7 +548,7 @@ static void
 gtk_input_dialog_clear_key (GtkWidget *widget, GtkInputKeyInfo *key)
 {
   gtk_entry_set_text (GTK_ENTRY(key->entry), _("(disabled)"));
-  gdk_input_set_key (key->inputd->current_device, key->index, 0, 0);
+  gdk_device_set_key (key->inputd->current_device, key->index, 0, 0);
 }
 
 static void 
@@ -609,8 +593,8 @@ gtk_input_dialog_key_press (GtkWidget *widget,
                            GtkInputKeyInfo *key)
 {
   gtk_input_dialog_set_key (key, event->keyval, event->state & 0xFF);
-  gdk_input_set_key (key->inputd->current_device, key->index, 
-                    event->keyval, event->state & 0xFF);
+  gdk_device_set_key (key->inputd->current_device, key->index, 
+                     event->keyval, event->state & 0xFF);
 
   gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
   
@@ -624,7 +608,7 @@ gtk_input_dialog_destroy_key (GtkWidget *widget, GtkInputKeyInfo *key)
 }
 
 static void
-gtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDeviceInfo *info)
+gtk_input_dialog_fill_keys(GtkInputDialog *inputd, GdkDevice *info)
 {
   int i;
   GtkWidget *label;
index b7d417b0524c713016e6be42c34fb77f3034310a..0d5ea00e23d3db97d740deb0dcbb53ee035b5c62 100644 (file)
@@ -60,7 +60,7 @@ struct _GtkInputDialog
   GtkWidget *save_button;
   
   GtkWidget *axis_items[GDK_AXIS_LAST];
-  guint32    current_device;
+  GdkDevice *current_device;
 
   GtkWidget *keys_list;
   GtkWidget *keys_listbox;
@@ -71,9 +71,9 @@ struct _GtkInputDialogClass
   GtkDialogClass parent_class;
 
   void (* enable_device)               (GtkInputDialog    *inputd,
-                                       guint32            devid);
+                                       GdkDevice         *device);
   void (* disable_device)              (GtkInputDialog    *inputd,
-                                       guint32            devid);
+                                       GdkDevice         *device);
 };
 
 
index 51cda7a2283a31cb7429f67556978fb4c0590d48..ef41d085d521d40ea6e85a03c76b6c515949b78c 100644 (file)
@@ -538,19 +538,16 @@ gtk_table_attach (GtkTable          *table,
   
   gtk_widget_set_parent (child, GTK_WIDGET (table));
   
-  if (GTK_WIDGET_VISIBLE (GTK_WIDGET (table)))
+  if (GTK_WIDGET_REALIZED (child->parent))
+    gtk_widget_realize (child);
+
+  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
     {
-      if (GTK_WIDGET_REALIZED (GTK_WIDGET (table)) &&
-         !GTK_WIDGET_REALIZED (child))
-       gtk_widget_realize (child);
-      
-      if (GTK_WIDGET_MAPPED (GTK_WIDGET (table)) &&
-         !GTK_WIDGET_MAPPED (child))
+      if (GTK_WIDGET_MAPPED (child->parent))
        gtk_widget_map (child);
+
+      gtk_widget_queue_resize (child);
     }
-  
-  if (GTK_WIDGET_VISIBLE (child) && GTK_WIDGET_VISIBLE (table))
-    gtk_widget_queue_resize (child);
 }
 
 void
index 65735a6b1acd40af388c35233216dced8d4499e9..257227a5b3031ca8bb0e462fa0f38397ca097ee1 100644 (file)
@@ -1848,7 +1848,12 @@ gtk_widget_draw (GtkWidget    *widget,
 
   if (GTK_WIDGET_DRAWABLE (widget))
     {
-      if (!area)
+      if (area)
+       {
+         if (area->width <= 0 || area->height <= 0)
+           return;
+       }
+      else
        {
          if (GTK_WIDGET_NO_WINDOW (widget))
            {
index b2e9e17df8be9953572b07ae7bb7da97c1724e4c..36cb6fc93bea870df21449389325c57f16af578d 100644 (file)
@@ -33,44 +33,19 @@ static GdkPixmap *pixmap = NULL;
 
 /* Information about cursor */
 
-static gint need_cursor = FALSE;
 static gint cursor_proximity = TRUE;
 static gdouble cursor_x;
 static gdouble cursor_y;
 
 /* Unique ID of current device */
-static guint32 current_device = GDK_CORE_POINTER;
-
-/* Check to see if we need to draw a cursor for current device */
-static void
-check_cursor (void)
-{
-  GList *tmp_list;
-
-  /* gdk_input_list_devices returns an internal list, so we shouldn't
-     free it afterwards */
-  tmp_list = gdk_input_list_devices();
-
-  while (tmp_list)
-    {
-      GdkDeviceInfo *info = (GdkDeviceInfo *)tmp_list->data;
-
-      if (info->deviceid == current_device)
-       {
-         need_cursor = !info->has_cursor;
-         break;
-       }
-
-      tmp_list = tmp_list->next;
-    }
-}
+static GdkDevice *current_device;
 
 /* Erase the old cursor, and/or draw a new one, if necessary */
 static void
 update_cursor (GtkWidget *widget,  gdouble x, gdouble y)
 {
   static gint cursor_present = 0;
-  gint state = need_cursor && cursor_proximity;
+  gint state = !current_device->has_cursor && cursor_proximity;
 
   if (pixmap != NULL)
     {
@@ -170,21 +145,36 @@ draw_brush (GtkWidget *widget, GdkInputSource source,
 
 static guint32 motion_time;
 
-static gint
-button_press_event (GtkWidget *widget, GdkEventButton *event)
+static void
+print_axes (GdkDevice *device, gdouble *axes)
 {
-  if (event->deviceid != current_device)
+  int i;
+  
+  if (axes)
     {
-      current_device = event->deviceid;
-      check_cursor ();
+      g_print ("%s ", device->name);
+      
+      for (i=0; i<device->num_axes; i++)
+       g_print ("%g ", axes[i]);
+
+      g_print ("\n");
     }
+}
 
+static gint
+button_press_event (GtkWidget *widget, GdkEventButton *event)
+{
+  current_device = event->device;
   cursor_proximity = TRUE;
 
   if (event->button == 1 && pixmap != NULL)
     {
-      draw_brush (widget, event->source, event->x, event->y,
-                 event->pressure);
+      gdouble pressure = 0.5;
+
+      print_axes (event->device, event->axes);
+      gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure);
+      draw_brush (widget, event->device->source, event->x, event->y, pressure);
+      
       motion_time = event->time;
     }
 
@@ -207,47 +197,47 @@ key_press_event (GtkWidget *widget, GdkEventKey *event)
 static gint
 motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
 {
-  GdkTimeCoord *coords;
-  int nevents;
+  GdkTimeCoord **events;
+  int n_events;
   int i;
 
-  if (event->deviceid != current_device)
-    {
-      current_device = event->deviceid;
-      check_cursor ();
-    }
-
+  current_device = event->device;
   cursor_proximity = TRUE;
 
   if (event->state & GDK_BUTTON1_MASK && pixmap != NULL)
     {
-      coords = gdk_input_motion_events (event->window, event->deviceid,
-                                       motion_time, event->time,
-                                       &nevents);
-      motion_time = event->time;
-      if (coords)
+      if (gdk_device_get_history (event->device, event->window, 
+                                 motion_time, event->time,
+                                 &events, &n_events))
        {
-         for (i=0; i<nevents; i++)
-           draw_brush (widget,  event->source, coords[i].x, coords[i].y,
-                       coords[i].pressure);
-         g_free (coords);
+         for (i=0; i<n_events; i++)
+           {
+             double x = 0, y = 0, pressure = 0.5;
+
+             gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_X, &x);
+             gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_Y, &y);
+             gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_PRESSURE, &pressure);
+             draw_brush (widget,  event->device->source, x, y, pressure);
+
+             print_axes (event->device, events[i]->axes);
+           }
+         gdk_device_free_history (events, n_events);
        }
       else
        {
-         if (event->is_hint)
-           gdk_input_window_get_pointer (event->window, event->deviceid,
-                                         NULL, NULL, NULL, NULL, NULL, NULL);
-         draw_brush (widget,  event->source, event->x, event->y,
-                     event->pressure);
+         double pressure = 0.5;
+
+         gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure);
+
+         draw_brush (widget,  event->device->source, event->x, event->y, pressure);
        }
-    }
-  else
-    {
-      gdk_input_window_get_pointer (event->window, event->deviceid,
-                                   &event->x, &event->y,
-                                   NULL, NULL, NULL, NULL);
+      motion_time = event->time;
     }
 
+  if (event->is_hint)
+    gdk_device_get_state (event->device, event->window, NULL, NULL);
+
+  print_axes (event->device, event->axes);
   update_cursor (widget, event->x, event->y);
 
   return TRUE;
@@ -293,10 +283,8 @@ create_input_dialog (void)
                          "clicked",
                          (GtkSignalFunc)gtk_widget_hide,
                          GTK_OBJECT(inputd));
-      gtk_widget_hide ( GTK_INPUT_DIALOG(inputd)->save_button);
+      gtk_widget_hide (GTK_INPUT_DIALOG(inputd)->save_button);
 
-      gtk_signal_connect (GTK_OBJECT(inputd), "enable_device",
-                         (GtkSignalFunc)check_cursor, NULL);
       gtk_widget_show (inputd);
     }
   else
@@ -325,6 +313,8 @@ main (int argc, char *argv[])
 
   gtk_init (&argc, &argv);
 
+  current_device = gdk_core_pointer;
+
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_widget_set_name (window, "Test Input");
 
index b2e9e17df8be9953572b07ae7bb7da97c1724e4c..36cb6fc93bea870df21449389325c57f16af578d 100644 (file)
@@ -33,44 +33,19 @@ static GdkPixmap *pixmap = NULL;
 
 /* Information about cursor */
 
-static gint need_cursor = FALSE;
 static gint cursor_proximity = TRUE;
 static gdouble cursor_x;
 static gdouble cursor_y;
 
 /* Unique ID of current device */
-static guint32 current_device = GDK_CORE_POINTER;
-
-/* Check to see if we need to draw a cursor for current device */
-static void
-check_cursor (void)
-{
-  GList *tmp_list;
-
-  /* gdk_input_list_devices returns an internal list, so we shouldn't
-     free it afterwards */
-  tmp_list = gdk_input_list_devices();
-
-  while (tmp_list)
-    {
-      GdkDeviceInfo *info = (GdkDeviceInfo *)tmp_list->data;
-
-      if (info->deviceid == current_device)
-       {
-         need_cursor = !info->has_cursor;
-         break;
-       }
-
-      tmp_list = tmp_list->next;
-    }
-}
+static GdkDevice *current_device;
 
 /* Erase the old cursor, and/or draw a new one, if necessary */
 static void
 update_cursor (GtkWidget *widget,  gdouble x, gdouble y)
 {
   static gint cursor_present = 0;
-  gint state = need_cursor && cursor_proximity;
+  gint state = !current_device->has_cursor && cursor_proximity;
 
   if (pixmap != NULL)
     {
@@ -170,21 +145,36 @@ draw_brush (GtkWidget *widget, GdkInputSource source,
 
 static guint32 motion_time;
 
-static gint
-button_press_event (GtkWidget *widget, GdkEventButton *event)
+static void
+print_axes (GdkDevice *device, gdouble *axes)
 {
-  if (event->deviceid != current_device)
+  int i;
+  
+  if (axes)
     {
-      current_device = event->deviceid;
-      check_cursor ();
+      g_print ("%s ", device->name);
+      
+      for (i=0; i<device->num_axes; i++)
+       g_print ("%g ", axes[i]);
+
+      g_print ("\n");
     }
+}
 
+static gint
+button_press_event (GtkWidget *widget, GdkEventButton *event)
+{
+  current_device = event->device;
   cursor_proximity = TRUE;
 
   if (event->button == 1 && pixmap != NULL)
     {
-      draw_brush (widget, event->source, event->x, event->y,
-                 event->pressure);
+      gdouble pressure = 0.5;
+
+      print_axes (event->device, event->axes);
+      gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure);
+      draw_brush (widget, event->device->source, event->x, event->y, pressure);
+      
       motion_time = event->time;
     }
 
@@ -207,47 +197,47 @@ key_press_event (GtkWidget *widget, GdkEventKey *event)
 static gint
 motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
 {
-  GdkTimeCoord *coords;
-  int nevents;
+  GdkTimeCoord **events;
+  int n_events;
   int i;
 
-  if (event->deviceid != current_device)
-    {
-      current_device = event->deviceid;
-      check_cursor ();
-    }
-
+  current_device = event->device;
   cursor_proximity = TRUE;
 
   if (event->state & GDK_BUTTON1_MASK && pixmap != NULL)
     {
-      coords = gdk_input_motion_events (event->window, event->deviceid,
-                                       motion_time, event->time,
-                                       &nevents);
-      motion_time = event->time;
-      if (coords)
+      if (gdk_device_get_history (event->device, event->window, 
+                                 motion_time, event->time,
+                                 &events, &n_events))
        {
-         for (i=0; i<nevents; i++)
-           draw_brush (widget,  event->source, coords[i].x, coords[i].y,
-                       coords[i].pressure);
-         g_free (coords);
+         for (i=0; i<n_events; i++)
+           {
+             double x = 0, y = 0, pressure = 0.5;
+
+             gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_X, &x);
+             gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_Y, &y);
+             gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_PRESSURE, &pressure);
+             draw_brush (widget,  event->device->source, x, y, pressure);
+
+             print_axes (event->device, events[i]->axes);
+           }
+         gdk_device_free_history (events, n_events);
        }
       else
        {
-         if (event->is_hint)
-           gdk_input_window_get_pointer (event->window, event->deviceid,
-                                         NULL, NULL, NULL, NULL, NULL, NULL);
-         draw_brush (widget,  event->source, event->x, event->y,
-                     event->pressure);
+         double pressure = 0.5;
+
+         gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure);
+
+         draw_brush (widget,  event->device->source, event->x, event->y, pressure);
        }
-    }
-  else
-    {
-      gdk_input_window_get_pointer (event->window, event->deviceid,
-                                   &event->x, &event->y,
-                                   NULL, NULL, NULL, NULL);
+      motion_time = event->time;
     }
 
+  if (event->is_hint)
+    gdk_device_get_state (event->device, event->window, NULL, NULL);
+
+  print_axes (event->device, event->axes);
   update_cursor (widget, event->x, event->y);
 
   return TRUE;
@@ -293,10 +283,8 @@ create_input_dialog (void)
                          "clicked",
                          (GtkSignalFunc)gtk_widget_hide,
                          GTK_OBJECT(inputd));
-      gtk_widget_hide ( GTK_INPUT_DIALOG(inputd)->save_button);
+      gtk_widget_hide (GTK_INPUT_DIALOG(inputd)->save_button);
 
-      gtk_signal_connect (GTK_OBJECT(inputd), "enable_device",
-                         (GtkSignalFunc)check_cursor, NULL);
       gtk_widget_show (inputd);
     }
   else
@@ -325,6 +313,8 @@ main (int argc, char *argv[])
 
   gtk_init (&argc, &argv);
 
+  current_device = gdk_core_pointer;
+
   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
   gtk_widget_set_name (window, "Test Input");